This is an automated email from the ASF dual-hosted git repository.

sammichen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new cf0235fb02 HDDS-8030. Cleanup unused/unnecessary code related to 
CertificateClient (#4317)
cf0235fb02 is described below

commit cf0235fb02cf65064d0679340f0b457120f66e77
Author: Istvan Fajth <[email protected]>
AuthorDate: Tue Mar 7 04:04:27 2023 +0100

    HDDS-8030. Cleanup unused/unnecessary code related to CertificateClient 
(#4317)
---
 .../apache/hadoop/ozone/HddsDatanodeService.java   |   2 -
 .../hadoop/ozone/TestHddsSecureDatanodeInit.java   |  20 --
 hadoop-hdds/framework/pom.xml                      |  11 +
 .../hdds/security/ssl/ReloadingX509KeyManager.java |  13 +-
 .../certificate/authority/DefaultApprover.java     |   8 +-
 .../x509/certificate/client/CertificateClient.java | 274 +++++--------------
 .../certificate/client/DNCertificateClient.java    |  15 +-
 .../client/DefaultCertificateClient.java           | 293 ++-------------------
 .../certificate/client/SCMCertificateClient.java   |  14 +-
 .../certificate/utils/CertificateSignRequest.java  |  55 +++-
 .../certificate/utils/SelfSignedCertificate.java   |  24 +-
 .../hdds/security/x509/keys/SecurityUtil.java      |  55 +---
 .../ssl/TestPemFileBasedKeyStoresFactory.java      |   6 +-
 .../security/ssl/TestReloadingX509KeyManager.java  |   7 +-
 .../ssl/TestReloadingX509TrustManager.java         |   7 +-
 .../token/TestOzoneBlockTokenSecretManager.java    |  36 ++-
 .../hdds/security/x509/CertificateClientTest.java  | 291 --------------------
 .../certificate/authority/TestDefaultCAServer.java |   8 +-
 .../client/CertificateClientTestImpl.java          | 141 +++-------
 .../client/TestDefaultCertificateClient.java       |  40 +--
 .../utils/TestCertificateSignRequest.java          |  13 +-
 .../apache/hadoop/hdds/scm/ha/HASecurityUtils.java |  12 +-
 hadoop-ozone/integration-test/pom.xml              |   7 +
 .../hdds/scm/storage/TestContainerCommandsEC.java  |   2 +-
 .../apache/hadoop/ozone/TestDelegationToken.java   |   2 +-
 .../hadoop/ozone/TestSecureOzoneCluster.java       |  32 ++-
 .../client/rpc/TestContainerStateMachine.java      |   2 +-
 .../rpc/TestContainerStateMachineFlushDelay.java   |   2 +-
 .../client/rpc/TestOzoneAtRestEncryption.java      |   2 +-
 .../ozone/client/rpc/TestSecureOzoneRpcClient.java |   2 +-
 .../ozoneimpl/TestOzoneContainerWithTLS.java       |   2 +-
 .../ozoneimpl/TestSecureOzoneContainer.java        |   2 +-
 .../server/TestSecureContainerServer.java          |   2 +-
 .../hadoop/ozone/om/TestSecureOzoneManager.java    |  20 +-
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |   8 +-
 .../hadoop/ozone/security/OMCertificateClient.java |  71 ++---
 .../om/ratis/TestOzoneManagerRatisServer.java      |   9 +-
 .../security/TestOmCertificateClientInit.java      |  10 +-
 .../TestOzoneDelegationTokenSecretManager.java     |  11 +-
 .../org/apache/hadoop/ozone/recon/ReconServer.java |  10 +-
 .../org/apache/hadoop/ozone/recon/ReconUtils.java  |  29 --
 .../recon/security}/ReconCertificateClient.java    |  35 +--
 .../hadoop/ozone/recon/security/package-info.java  |  22 ++
 .../impl/StorageContainerServiceProviderImpl.java  |   5 +-
 44 files changed, 406 insertions(+), 1226 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java
index 49784eabc8..41965573b8 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java
@@ -352,8 +352,6 @@ public class HddsDatanodeService extends GenericCli 
implements ServicePlugin {
       // persist cert ID to VERSION file
       datanodeDetails.setCertSerialId(dnCertSerialId);
       persistDatanodeDetails(datanodeDetails);
-      // set new certificate ID
-      certClient.setCertificateId(dnCertSerialId);
       LOG.info("Successfully stored SCM signed certificate, case:{}.",
           response);
       break;
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/TestHddsSecureDatanodeInit.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/TestHddsSecureDatanodeInit.java
index bb76de1f71..1923044a80 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/TestHddsSecureDatanodeInit.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/TestHddsSecureDatanodeInit.java
@@ -55,7 +55,6 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import org.bouncycastle.cert.X509CertificateHolder;
-import org.bouncycastle.pkcs.PKCS10CertificationRequest;
 import org.junit.Assert;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
@@ -274,25 +273,6 @@ public class TestHddsSecureDatanodeInit {
     }
   }
 
-  @Test
-  public void testGetCSR() throws Exception {
-    keyCodec.writePublicKey(publicKey);
-    keyCodec.writePrivateKey(privateKey);
-    service.setCertificateClient(client);
-    PKCS10CertificationRequest csr =
-        client.getCSRBuilder().build();
-    Assertions.assertNotNull(csr);
-
-    csr = client.getCSRBuilder().build();
-    Assertions.assertNotNull(csr);
-
-    csr = client.getCSRBuilder().build();
-    Assertions.assertNotNull(csr);
-
-    csr = client.getCSRBuilder().build();
-    Assertions.assertNotNull(csr);
-  }
-
   @Test
   @Disabled("HDDS-7874")
   public void testCertificateRotation() throws Exception {
diff --git a/hadoop-hdds/framework/pom.xml b/hadoop-hdds/framework/pom.xml
index d49e86819d..746129aae2 100644
--- a/hadoop-hdds/framework/pom.xml
+++ b/hadoop-hdds/framework/pom.xml
@@ -182,6 +182,17 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd";>
           
<excludeFilterFile>${basedir}/dev-support/findbugsExcludeFile.xml</excludeFilterFile>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java
index 53e640050a..450d422bd5 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java
@@ -35,6 +35,7 @@ import java.security.Principal;
 import java.security.PrivateKey;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
+import java.util.Locale;
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
@@ -79,7 +80,7 @@ public class ReloadingX509KeyManager extends 
X509ExtendedKeyManager {
   public ReloadingX509KeyManager(String type, CertificateClient caClient)
       throws GeneralSecurityException, IOException {
     this.type = type;
-    keyManagerRef = new AtomicReference<X509ExtendedKeyManager>();
+    keyManagerRef = new AtomicReference<>();
     keyManagerRef.set(loadKeyManager(caClient));
   }
 
@@ -121,12 +122,18 @@ public class ReloadingX509KeyManager extends 
X509ExtendedKeyManager {
 
   @Override
   public X509Certificate[] getCertificateChain(String s) {
-    return keyManagerRef.get().getCertificateChain(s);
+    // see https://bugs.openjdk.org/browse/JDK-4891485
+    // the KeyManager stores the chain in a case-insensitive way making the
+    // alias lowercase upon initialization.
+    return keyManagerRef.get().getCertificateChain(s.toLowerCase(Locale.ROOT));
   }
 
   @Override
   public PrivateKey getPrivateKey(String s) {
-    return keyManagerRef.get().getPrivateKey(s);
+    // see: https://bugs.openjdk.org/browse/JDK-4891485
+    // the KeyManager stores the chain in a case-insensitive way making the
+    // alias lowercase upon initialization.
+    return keyManagerRef.get().getPrivateKey(s.toLowerCase(Locale.ROOT));
   }
 
   public ReloadingX509KeyManager loadFrom(CertificateClient caClient) {
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/DefaultApprover.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/DefaultApprover.java
index c3af15ff4e..4277dbe70f 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/DefaultApprover.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/DefaultApprover.java
@@ -22,7 +22,6 @@ package 
org.apache.hadoop.hdds.security.x509.certificate.authority;
 import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.profile.PKIProfile;
-import org.apache.hadoop.hdds.security.x509.keys.SecurityUtil;
 import org.apache.hadoop.util.Time;
 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
 import org.bouncycastle.asn1.x500.X500Name;
@@ -50,6 +49,9 @@ import java.security.PrivateKey;
 import java.util.Date;
 import java.util.concurrent.CompletableFuture;
 
+import static 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest.getDistinguishedName;
+import static 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest.getPkcs9Extensions;
+
 /**
  * Default Approver used the by the DefaultCA.
  */
@@ -119,7 +121,7 @@ public class DefaultApprover extends BaseApprover {
         // will succeed only after datanode has a valid certificate.
         String cn = x500Name.getRDNs(BCStyle.CN)[0].getFirst().getValue()
             .toASN1Primitive().toString();
-        x500Name = SecurityUtil.getDistinguishedName(cn, scmId, clusterId);
+        x500Name = getDistinguishedName(cn, scmId, clusterId);
       } else {
         // Throw exception if scmId and clusterId doesn't match.
         throw new SCMSecurityException("ScmId and ClusterId in CSR subject" +
@@ -142,7 +144,7 @@ public class DefaultApprover extends BaseApprover {
             validTill,
             x500Name, keyInfo);
 
-    Extensions exts = SecurityUtil.getPkcs9Extensions(certificationRequest);
+    Extensions exts = getPkcs9Extensions(certificationRequest);
     for (ASN1ObjectIdentifier extId : getProfile().getSupportedExtensions()) {
       Extension ext = exts.getExtension(extId);
       if (ext != null) {
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java
index 73123c34a6..8c8a2df056 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java
@@ -23,19 +23,14 @@ import 
org.apache.hadoop.hdds.security.OzoneSecurityException;
 import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory;
 import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
 import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
-import org.apache.hadoop.hdds.security.x509.crl.CRLInfo;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
 import org.bouncycastle.pkcs.PKCS10CertificationRequest;
 
 import java.io.Closeable;
 import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.security.KeyPair;
 import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.cert.CertPath;
-import java.security.cert.CertStore;
 import java.security.cert.X509Certificate;
 import java.util.List;
 import java.util.Objects;
@@ -48,6 +43,12 @@ import static 
org.apache.hadoop.hdds.security.OzoneSecurityException.ResultCodes
  */
 public interface CertificateClient extends Closeable {
 
+  /**
+   * Return component name of this certificate client.
+   * @return component name
+   */
+  String getComponentName();
+
   /**
    * Returns the private key of the specified component if it exists on the
    * local system.
@@ -64,6 +65,14 @@ public interface CertificateClient extends Closeable {
    */
   PublicKey getPublicKey();
 
+  /**
+   * Returns the certificate used by the specified component if it exists
+   * on the local system.
+   *
+   * @return the target certificate or null if there is no data.
+   */
+  X509Certificate getCertificate();
+
   /**
    * Returns the certificate  of the specified component if it exists on the
    * local system.
@@ -83,12 +92,11 @@ public interface CertificateClient extends Closeable {
   CertPath getCertPath();
 
   /**
-   * Returns the certificate used by the specified component if it exists
-   * on the local system.
+   * Return the latest CA certificate known to the client.
    *
-   * @return the target certificate or null if there is no data.
+   * @return latest ca certificate known to the client.
    */
-  X509Certificate getCertificate();
+  X509Certificate getCACertificate();
 
   /**
    * Returns the full certificate path for the CA certificate known to the
@@ -99,50 +107,48 @@ public interface CertificateClient extends Closeable {
   CertPath getCACertPath();
 
   /**
-   * Return the latest CA certificate known to the client.
+   * Return the latest Root CA certificate known to the client.
+   * @return latest Root CA certificate known to the client.
+   */
+  X509Certificate getRootCACertificate();
+
+  /**
+   * Return the pem encoded CA certificate list.
    *
-   * @return latest ca certificate known to the client.
+   * If initialized return list of pem encoded CA certificates, else return
+   * null.
+   * @return list of pem encoded CA certificates.
    */
-  X509Certificate getCACertificate();
+  List<String> getCAList();
 
   /**
-   * Verifies if this certificate is part of a trusted chain.
-   * @param certificate - certificate.
-   * @return true if it trusted, false otherwise.
+   * Return the pem encoded  CA certificate list.
+   *
+   * If list is null, fetch the list from SCM and returns the list.
+   * If list is not null, return the pem encoded  CA certificate list.
+   *
+   * @return list of pem encoded  CA certificates.
+   * @throws IOException
    */
-  boolean verifyCertificate(X509Certificate certificate);
+  List<String> listCA() throws IOException;
 
   /**
-   * Set the serial ID of default certificate for the specified component.
-   * @param certSerialId - certificate ID.
-   * */
-  void setCertificateId(String certSerialId);
+   * Update and returns the pem encoded CA certificate list.
+   * @return list of pem encoded  CA certificates.
+   * @throws IOException
+   */
+  List<String> updateCAList() throws IOException;
 
   /**
    * Creates digital signature over the data stream using the components 
private
    * key.
    *
-   * @param stream - Data stream to sign.
-   * @return byte array - containing the signature.
-   * @throws CertificateException - on Error.
+   * @param data data to be signed
+   * @return byte array - containing the signature
+   * @throws CertificateException - on Error
    */
-  byte[] signDataStream(InputStream stream)
-      throws CertificateException;
-
   byte[] signData(byte[] data) throws CertificateException;
 
-  /**
-   * Verifies a digital Signature, given the signature and the certificate of
-   * the signer.
-   *
-   * @param stream - Data Stream.
-   * @param signature - Byte Array containing the signature.
-   * @param cert - Certificate of the Signer.
-   * @return true if verified, false if not.
-   */
-  boolean verifySignature(InputStream stream, byte[] signature,
-      X509Certificate cert) throws CertificateException;
-
   /**
    * Verifies a digital Signature, given the signature and the certificate of
    * the signer.
@@ -154,15 +160,6 @@ public interface CertificateClient extends Closeable {
   boolean verifySignature(byte[] data, byte[] signature,
       X509Certificate cert) throws CertificateException;
 
-  /**
-   * Returns a CSR builder that can be used to creates a Certificate sigining
-   * request.
-   *
-   * @return CertificateSignRequest.Builder
-   */
-   CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
-       throws IOException;
-
   /**
    * Returns a CSR builder that can be used to create a Certificate sigining
    * request.
@@ -172,15 +169,6 @@ public interface CertificateClient extends Closeable {
   CertificateSignRequest.Builder getCSRBuilder()
       throws CertificateException;
 
-  /**
-   * Send request to SCM to sign the certificate and save certificates returned
-   * by SCM to PEM files on disk.
-   *
-   * @return the serial ID of the new certificate
-   */
-  String signAndStoreCertificate(PKCS10CertificationRequest request,
-      Path certPath) throws CertificateException;
-
   /**
    * Send request to SCM to sign the certificate and save certificates returned
    * by SCM to PEM files on disk.
@@ -190,53 +178,45 @@ public interface CertificateClient extends Closeable {
   String signAndStoreCertificate(PKCS10CertificationRequest request)
       throws CertificateException;
 
-  /**
-   * Get the certificate of well-known entity from SCM.
-   *
-   * @param query - String Query, please see the implementation for the
-   * discussion on the query formats.
-   * @return X509Certificate or null if not found.
-   */
-  X509Certificate queryCertificate(String query);
-
   /**
    * Stores the Certificate  for this client. Don't use this api to add
    * trusted certificates of others.
    *
    * @param pemEncodedCert - pem encoded X509 Certificate
+   * @param caType         - Is CA certificate.
    * @throws CertificateException - on Error.
    */
-  void storeCertificate(String pemEncodedCert)
+  void storeCertificate(String pemEncodedCert, CAType caType)
       throws CertificateException;
 
+  default void assertValidKeysAndCertificate() throws OzoneSecurityException {
+    try {
+      Objects.requireNonNull(getPublicKey());
+      Objects.requireNonNull(getPrivateKey());
+      Objects.requireNonNull(getCertificate());
+    } catch (Exception e) {
+      throw new OzoneSecurityException("Error reading keypair & certificate", 
e,
+          OM_PUBLIC_PRIVATE_KEY_FILE_NOT_EXIST);
+    }
+  }
+
   /**
-   * Stores the Certificate  for this client. Don't use this api to add
-   * trusted certificates of others.
-   *
-   * @param pemEncodedCert - pem encoded X509 Certificate
-   * @param caType         - Is CA certificate.
-   * @throws CertificateException - on Error.
+   * Return the store factory for key manager and trust manager for server.
    */
-  void storeCertificate(String pemEncodedCert, CAType caType)
-      throws CertificateException;
+  KeyStoresFactory getServerKeyStoresFactory() throws CertificateException;
 
   /**
-   * Stores the trusted chain of certificates.
-   *
-   * @param certStore - Cert Store.
-   * @throws CertificateException - on Error.
+   * Return the store factory for key manager and trust manager for client.
    */
-  void storeTrustChain(CertStore certStore) throws CertificateException;
+  KeyStoresFactory getClientKeyStoresFactory() throws CertificateException;
 
   /**
-   * Stores the trusted chain of certificates.
+   * Register a receiver that will be called after the certificate renewed.
    *
-   * @param certificates - List of Certificates.
-
-   * @throws CertificateException - on Error.
+   * @param receiver
    */
-  void storeTrustChain(List<X509Certificate> certificates)
-      throws CertificateException;
+  void registerNotificationReceiver(CertificateNotification receiver);
+
 
   /**
    * Initialize certificate client.
@@ -260,128 +240,4 @@ public interface CertificateClient extends Closeable {
     RECOVER,
     REINIT
   }
-
-  /**
-   * Get signature algorithm used by signer.
-   * @return signature algorithm
-   */
-  String getSignatureAlgorithm();
-
-  /**
-   * Get security provider.
-   * @return security provider
-   */
-  String getSecurityProvider();
-
-  /**
-   * Return component name of this certificate client.
-   * @return component name
-   */
-  String getComponentName();
-
-  /**
-   * Return the latest Root CA certificate known to the client.
-   * @return latest Root CA certificate known to the client.
-   */
-  X509Certificate getRootCACertificate();
-
-  /**
-   * Store RootCA certificate.
-   *
-   * @param pemEncodedCert
-   * @throws CertificateException
-   */
-  void storeRootCACertificate(String pemEncodedCert)
-      throws CertificateException;
-
-  /**
-   * Return the pem encoded CA certificate list.
-   *
-   * If initialized return list of pem encoded CA certificates, else return
-   * null.
-   * @return list of pem encoded CA certificates.
-   */
-  List<String> getCAList();
-
-  /**
-   * Return the pem encoded  CA certificate list.
-   *
-   * If list is null, fetch the list from SCM and returns the list.
-   * If list is not null, return the pem encoded  CA certificate list.
-   *
-   * @return list of pem encoded  CA certificates.
-   * @throws IOException
-   */
-  List<String> listCA() throws IOException;
-
-  /**
-   * Update and returns the pem encoded CA certificate list.
-   * @return list of pem encoded  CA certificates.
-   * @throws IOException
-   */
-  List<String> updateCAList() throws IOException;
-
-  /**
-   * Get the CRLInfo based on the CRL Ids from SCM.
-   * @param crlIds - list of crl ids
-   * @return list of CRLInfo
-   * @throws IOException
-   */
-  List<CRLInfo> getCrls(List<Long> crlIds) throws IOException;
-
-  /**
-   * Get the latest CRL id from SCM.
-   * @return latest CRL id.
-   * @throws IOException
-   */
-  long getLatestCrlId() throws IOException;
-
-  default void assertValidKeysAndCertificate() throws OzoneSecurityException {
-    try {
-      Objects.requireNonNull(getPublicKey());
-      Objects.requireNonNull(getPrivateKey());
-      Objects.requireNonNull(getCertificate());
-    } catch (Exception e) {
-      throw new OzoneSecurityException("Error reading keypair & certificate", 
e,
-          OM_PUBLIC_PRIVATE_KEY_FILE_NOT_EXIST);
-    }
-  }
-
-  /**
-   * Get Local CRL id received.
-   * @return
-   */
-  long getLocalCrlId();
-
-  /**
-   * Set Local CRL id.
-   * @param crlId
-   */
-  void setLocalCrlId(long crlId);
-
-  /**
-   * Process crl and remove the certificates in the revoked cert list from
-   * client.
-   * @param crl
-   * @return true if the client's own cert needs to be reinit
-   * false otherwise;
-   */
-  boolean processCrl(CRLInfo crl);
-
-  /**
-   * Return the store factory for key manager and trust manager for server.
-   */
-  KeyStoresFactory getServerKeyStoresFactory() throws CertificateException;
-
-  /**
-   * Return the store factory for key manager and trust manager for client.
-   */
-  KeyStoresFactory getClientKeyStoresFactory() throws CertificateException;
-
-  /**
-   * Register a receiver that will be called after the certificate renewed.
-   *
-   * @param receiver
-   */
-  void registerNotificationReceiver(CertificateNotification receiver);
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DNCertificateClient.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DNCertificateClient.java
index 6d04d20674..d05de0b05c 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DNCertificateClient.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DNCertificateClient.java
@@ -70,19 +70,6 @@ public class DNCertificateClient extends 
DefaultCertificateClient {
   @Override
   public CertificateSignRequest.Builder getCSRBuilder()
       throws CertificateException {
-    return getCSRBuilder(new KeyPair(getPublicKey(), getPrivateKey()));
-  }
-
-  /**
-   * Returns a CSR builder that can be used to creates a Certificate signing
-   * request.
-   * The default flag is added to allow basic SSL handshake.
-   *
-   * @return CertificateSignRequest.Builder
-   */
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
-      throws CertificateException {
     CertificateSignRequest.Builder builder = super.getCSRBuilder()
         .setDigitalEncryption(true)
         .setDigitalSignature(true);
@@ -92,7 +79,7 @@ public class DNCertificateClient extends 
DefaultCertificateClient {
       String subject = UserGroupInformation.getCurrentUser()
           .getShortUserName() + "@" + hostname;
       builder.setCA(false)
-          .setKey(keyPair)
+          .setKey(new KeyPair(getPublicKey(), getPrivateKey()))
           .setConfiguration(getConfig())
           .setSubject(subject);
 
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java
index b0b979f586..57087d0d24 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java
@@ -19,10 +19,8 @@
 
 package org.apache.hadoop.hdds.security.x509.certificate.client;
 
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -38,20 +36,17 @@ import java.security.SecureRandom;
 import java.security.Signature;
 import java.security.SignatureException;
 import java.security.cert.CertPath;
-import java.security.cert.CertStore;
 import java.security.cert.X509Certificate;
 import java.security.spec.InvalidKeySpecException;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executors;
@@ -68,7 +63,6 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import 
org.apache.hadoop.hdds.protocolPB.SCMSecurityProtocolClientSideTranslatorPB;
 import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory;
 import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
-import org.apache.hadoop.hdds.security.x509.crl.CRLInfo;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
 import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
@@ -110,9 +104,8 @@ import org.slf4j.Logger;
  */
 public abstract class DefaultCertificateClient implements CertificateClient {
 
-  private static final Random RANDOM = new SecureRandom();
-
   public static final String CERT_FILE_NAME_FORMAT = "%s.crt";
+
   private final Logger logger;
   private final SecurityConfig securityConfig;
   private final KeyCodec keyCodec;
@@ -123,7 +116,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
   private String certSerialId;
   private String caCertId;
   private String rootCaCertId;
-  private long localCrlId;
   private String component;
   private List<String> pemEncodedCACerts = null;
   private KeyStoresFactory serverKeyStoresFactory;
@@ -145,7 +137,7 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
   private Set<CertificateNotification> notificationReceivers;
   private static UserGroupInformation ugi;
 
-  DefaultCertificateClient(SecurityConfig securityConfig, Logger log,
+  protected DefaultCertificateClient(SecurityConfig securityConfig, Logger log,
       String certSerialId, String component,
       Consumer<String> saveCertId, Runnable shutdown) {
     Objects.requireNonNull(securityConfig);
@@ -153,21 +145,12 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     keyCodec = new KeyCodec(securityConfig, component);
     this.logger = log;
     this.certificateMap = new ConcurrentHashMap<>();
-    this.certSerialId = certSerialId;
     this.component = component;
     this.certIdSaveCallback = saveCertId;
     this.shutdownCallback = shutdown;
     this.notificationReceivers = new HashSet<>();
 
-    loadAllCertificates();
-  }
-
-  public synchronized void setCertificateId(String certId) {
-    Preconditions.checkArgument(certSerialId == null,
-        "certSerialId should only be set once if not renew");
-    this.certSerialId = certId;
-    // reload all new certs
-    loadAllCertificates();
+    updateCertSerialId(certSerialId);
   }
 
   /**
@@ -375,29 +358,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     return this.getCertificateFromScm(certId);
   }
 
-  @Override
-  public List<CRLInfo> getCrls(List<Long> crlIds) throws IOException {
-    try {
-      return getScmSecureClient().getCrls(crlIds);
-    } catch (Exception e) {
-      getLogger().error("Error while getting CRL with " +
-          "CRL ids:{} from scm.", crlIds, e);
-      throw new CertificateException("Error while getting CRL with " +
-          "CRL ids:" + crlIds, e);
-    }
-  }
-
-  @Override
-  public long getLatestCrlId() throws IOException {
-    try {
-      return getScmSecureClient().getLatestCrlId();
-    } catch (Exception e) {
-      getLogger().error("Error while getting latest CRL id from scm.", e);
-      throw new CertificateException("Error while getting latest CRL id from" +
-          " scm.", e);
-    }
-  }
-
   /**
    * Get certificate from SCM and store it in local file system.
    * @param certId
@@ -410,7 +370,7 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
         certId);
     try {
       String pemEncodedCert = getScmSecureClient().getCertificate(certId);
-      this.storeCertificate(pemEncodedCert);
+      this.storeCertificate(pemEncodedCert, CAType.NONE);
       return CertificateCodec.getX509Certificate(pemEncodedCert);
     } catch (Exception e) {
       getLogger().error("Error while getting Certificate with " +
@@ -420,50 +380,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     }
   }
 
-  /**
-   * Verifies if this certificate is part of a trusted chain.
-   *
-   * @param certificate - certificate.
-   * @return true if it trusted, false otherwise.
-   */
-  @Override
-  public boolean verifyCertificate(X509Certificate certificate) {
-    throw new UnsupportedOperationException("Operation not supported.");
-  }
-
-  /**
-   * Creates digital signature over the data stream using the s private key.
-   *
-   * @param stream - Data stream to sign.
-   * @throws CertificateException - on Error.
-   */
-  @Override
-  public byte[] signDataStream(InputStream stream)
-      throws CertificateException {
-    try {
-      Signature sign = Signature.getInstance(getSignatureAlgorithm(),
-          getSecurityProvider());
-      sign.initSign(getPrivateKey());
-      byte[] buffer = new byte[1024 * 4];
-
-      int len;
-      while (-1 != (len = stream.read(buffer))) {
-        sign.update(buffer, 0, len);
-      }
-      return sign.sign();
-    } catch (NoSuchAlgorithmException | NoSuchProviderException
-        | InvalidKeyException | SignatureException | IOException e) {
-      getLogger().error("Error while signing the stream", e);
-      throw new CertificateException("Error while signing the stream", e,
-          CRYPTO_SIGN_ERROR);
-    }
-  }
-
-  @Override
-  public String getSecurityProvider() {
-    return securityConfig.getProvider();
-  }
-
   /**
    * Creates digital signature over the data stream using the s private key.
    *
@@ -473,8 +389,8 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
   @Override
   public byte[] signData(byte[] data) throws CertificateException {
     try {
-      Signature sign = Signature.getInstance(getSignatureAlgorithm(),
-          getSecurityProvider());
+      Signature sign = Signature.getInstance(securityConfig.getSignatureAlgo(),
+          securityConfig.getProvider());
 
       sign.initSign(getPrivateKey());
       sign.update(data);
@@ -488,42 +404,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     }
   }
 
-  @Override
-  public String getSignatureAlgorithm() {
-    return securityConfig.getSignatureAlgo();
-  }
-
-  /**
-   * Verifies a digital Signature, given the signature and the certificate of
-   * the signer.
-   *
-   * @param stream - Data Stream.
-   * @param signature - Byte Array containing the signature.
-   * @param cert - Certificate of the Signer.
-   * @return true if verified, false if not.
-   */
-  @Override
-  public boolean verifySignature(InputStream stream, byte[] signature,
-      X509Certificate cert) throws CertificateException {
-    try {
-      Signature sign = Signature.getInstance(getSignatureAlgorithm(),
-          getSecurityProvider());
-      sign.initVerify(cert);
-      byte[] buffer = new byte[1024 * 4];
-
-      int len;
-      while (-1 != (len = stream.read(buffer))) {
-        sign.update(buffer, 0, len);
-      }
-      return sign.verify(signature);
-    } catch (NoSuchAlgorithmException | NoSuchProviderException
-        | InvalidKeyException | SignatureException | IOException e) {
-      getLogger().error("Error while signing the stream", e);
-      throw new CertificateException("Error while signing the stream", e,
-          CRYPTO_SIGNATURE_VERIFICATION_ERROR);
-    }
-  }
-
   /**
    * Verifies a digital Signature, given the signature and the certificate of
    * the signer.
@@ -537,8 +417,8 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
   public boolean verifySignature(byte[] data, byte[] signature,
       X509Certificate cert) throws CertificateException {
     try {
-      Signature sign = Signature.getInstance(getSignatureAlgorithm(),
-          getSecurityProvider());
+      Signature sign = Signature.getInstance(securityConfig.getSignatureAlgo(),
+          securityConfig.getProvider());
       sign.initVerify(cert);
       sign.update(data);
       return sign.verify(signature);
@@ -562,8 +442,8 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
   private boolean verifySignature(byte[] data, byte[] signature,
       PublicKey pubKey) throws CertificateException {
     try {
-      Signature sign = Signature.getInstance(getSignatureAlgorithm(),
-          getSecurityProvider());
+      Signature sign = Signature.getInstance(securityConfig.getSignatureAlgo(),
+          securityConfig.getProvider());
       sign.initVerify(pubKey);
       sign.update(data);
       return sign.verify(signature);
@@ -606,32 +486,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     return builder;
   }
 
-  /**
-   * Get the certificate of well-known entity from SCM.
-   *
-   * @param query - String Query, please see the implementation for the
-   * discussion on the query formats.
-   * @return X509Certificate or null if not found.
-   */
-  @Override
-  public X509Certificate queryCertificate(String query) {
-    // TODO:
-    throw new UnsupportedOperationException("Operation not supported");
-  }
-
-  /**
-   * Stores the Certificate  for this client. Don't use this api to add trusted
-   * certificates of others.
-   *
-   * @param pemEncodedCert - pem encoded X509 Certificate
-   * @throws CertificateException - on Error.
-   */
-  @Override
-  public void storeCertificate(String pemEncodedCert)
-      throws CertificateException {
-    this.storeCertificate(pemEncodedCert, CAType.NONE);
-  }
-
   /**
    * Stores the Certificate  for this client. Don't use this api to add trusted
    * certificates of others.
@@ -679,31 +533,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     }
   }
 
-  /**
-   * Stores the trusted chain of certificates for a specific .
-   *
-   * @param ks - Key Store.
-   * @throws CertificateException - on Error.
-   */
-  @Override
-  public void storeTrustChain(CertStore ks)
-      throws CertificateException {
-    throw new UnsupportedOperationException("Operation not supported.");
-  }
-
-
-  /**
-   * Stores the trusted chain of certificates for a specific .
-   *
-   * @param certificates - List of Certificates.
-   * @throws CertificateException - on Error.
-   */
-  @Override
-  public void storeTrustChain(List<X509Certificate> certificates)
-      throws CertificateException {
-    throw new UnsupportedOperationException("Operation not supported.");
-  }
-
   /**
    * Defines 8 cases of initialization.
    * Each case specifies objects found.
@@ -957,10 +786,9 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
   protected boolean validateKeyPair(PublicKey pubKey)
       throws CertificateException {
     byte[] challenge =
-        RandomStringUtils.random(1000, 0, 0, false, false, null, RANDOM)
-            .getBytes(StandardCharsets.UTF_8);
-    byte[]  sign = signDataStream(new ByteArrayInputStream(challenge));
-    return verifySignature(challenge, sign, pubKey);
+        RandomStringUtils.random(1000, 0, 0, false, false, null,
+                new SecureRandom()).getBytes(StandardCharsets.UTF_8);
+    return verifySignature(challenge, signData(challenge), pubKey);
   }
 
   /**
@@ -1014,14 +842,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     return null;
   }
 
-  @Override
-  public void storeRootCACertificate(String pemEncodedCert)
-      throws CertificateException {
-    CertificateCodec certificateCodec = new CertificateCodec(securityConfig,
-        component);
-    storeCertificate(pemEncodedCert, CAType.ROOT, certificateCodec, true);
-  }
-
   @Override
   public synchronized List<String> getCAList() {
     return pemEncodedCACerts;
@@ -1047,63 +867,6 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     }
   }
 
-  @Override
-  public boolean processCrl(CRLInfo crl) {
-    List<String> certIds2Remove = new ArrayList();
-    crl.getX509CRL().getRevokedCertificates().forEach(
-        cert -> certIds2Remove.add(cert.getSerialNumber().toString()));
-    boolean reinitCert = removeCertificates(certIds2Remove);
-    setLocalCrlId(crl.getCrlSequenceID());
-    return reinitCert;
-  }
-
-  private synchronized boolean removeCertificates(List<String> certIds) {
-    boolean reInitCert = false;
-
-    // For now, remove self cert and ca cert is not implemented
-    // both requires a restart of the service.
-    if ((certSerialId != null && certIds.contains(certSerialId)) ||
-        (caCertId != null && certIds.contains(caCertId)) ||
-        (rootCaCertId != null && certIds.contains(rootCaCertId))) {
-      reInitCert = true;
-    }
-
-    Path basePath = securityConfig.getCertificateLocation(component);
-    for (String certId : certIds) {
-      if (certificateMap.containsKey(certId)) {
-        // remove on disk
-        String certName = String.format(CERT_FILE_NAME_FORMAT, certId);
-
-        if (certId.equals(caCertId)) {
-          certName = CAType.SUBORDINATE.getFileNamePrefix() + certName;
-        }
-
-        if (certId.equals(rootCaCertId)) {
-          certName = CAType.ROOT.getFileNamePrefix() + certName;
-        }
-
-        FileUtils.deleteQuietly(basePath.resolve(certName).toFile());
-        // remove in memory
-        certificateMap.remove(certId);
-
-        // TODO: reset certSerialId, caCertId or rootCaCertId
-      }
-    }
-    return reInitCert;
-  }
-
-  public long getLocalCrlId() {
-    return this.localCrlId;
-  }
-
-  /**
-   * Set Local CRL id.
-   * @param crlId
-   */
-  public void setLocalCrlId(long crlId) {
-    this.localCrlId = crlId;
-  }
-
   @Override
   public synchronized KeyStoresFactory getServerKeyStoresFactory()
       throws CertificateException {
@@ -1216,7 +979,8 @@ public abstract class DefaultCertificateClient implements 
CertificateClient {
     // Get certificate signed
     String newCertSerialId;
     try {
-      CertificateSignRequest.Builder csrBuilder = getCSRBuilder(newKeyPair);
+      CertificateSignRequest.Builder csrBuilder = getCSRBuilder();
+      csrBuilder.setKey(newKeyPair);
       newCertSerialId = signAndStoreCertificate(csrBuilder.build(),
           Paths.get(newCertPath));
     } catch (Exception e) {
@@ -1363,11 +1127,10 @@ public abstract class DefaultCertificateClient 
implements CertificateClient {
     privateKey = null;
     publicKey = null;
     certPath = null;
-    certSerialId = null;
     caCertId = null;
     rootCaCertId = null;
 
-    setCertificateId(newCertId);
+    updateCertSerialId(newCertId);
     getLogger().info("Reset and reload key and all certificates.");
   }
 
@@ -1379,27 +1142,27 @@ public abstract class DefaultCertificateClient 
implements CertificateClient {
     return (OzoneConfiguration)securityConfig.getConfiguration();
   }
 
-  @Override
-  public abstract String signAndStoreCertificate(
+  private synchronized void updateCertSerialId(String newCertSerialId) {
+    certSerialId = newCertSerialId;
+    loadAllCertificates();
+  }
+
+  protected abstract String signAndStoreCertificate(
       PKCS10CertificationRequest request, Path certificatePath)
       throws CertificateException;
 
-  public String signAndStoreCertificate(PKCS10CertificationRequest request)
-      throws CertificateException {
-    return signAndStoreCertificate(request,
-        getSecurityConfig().getCertificateLocation(getComponentName()));
+  public String signAndStoreCertificate(
+      PKCS10CertificationRequest request) throws CertificateException {
+    updateCertSerialId(signAndStoreCertificate(request,
+        getSecurityConfig().getCertificateLocation(getComponentName())));
+    return certSerialId;
   }
 
-  @Override
-  public abstract CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
-      throws CertificateException;
-
   public SCMSecurityProtocolClientSideTranslatorPB getScmSecureClient()
       throws IOException {
     if (scmSecurityProtocolClient == null) {
       scmSecurityProtocolClient =
-          getScmSecurityClientWithMaxRetry(
-              (OzoneConfiguration) securityConfig.getConfiguration(), ugi);
+          getScmSecurityClientWithMaxRetry(getConfig(), ugi);
     }
     return scmSecurityProtocolClient;
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
index 8b687296cb..2f64017af6 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
@@ -54,10 +54,6 @@ public class SCMCertificateClient extends 
DefaultCertificateClient {
     super(securityConfig, LOG, certSerialId, COMPONENT_NAME, null, null);
   }
 
-  public SCMCertificateClient(SecurityConfig securityConfig) {
-    super(securityConfig, LOG, null, COMPONENT_NAME, null, null);
-  }
-
   public SCMCertificateClient(SecurityConfig securityConfig,
       String certSerialId, String component) {
     super(securityConfig, LOG, certSerialId, component, null, null);
@@ -135,7 +131,8 @@ public class SCMCertificateClient extends 
DefaultCertificateClient {
         .setDigitalEncryption(true)
         .setDigitalSignature(true)
         // Set CA to true, as this will be used to sign certs for OM/DN.
-        .setCA(true);
+        .setCA(true)
+        .setKey(new KeyPair(getPublicKey(), getPrivateKey()));
   }
 
 
@@ -150,11 +147,4 @@ public class SCMCertificateClient extends 
DefaultCertificateClient {
     throw new UnsupportedOperationException("signAndStoreCertificate of " +
         " SCMCertificateClient is not supported currently");
   }
-
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
-      throws CertificateException {
-    throw new UnsupportedOperationException("getCSRBuilder of " +
-        "SCMCertificateClient is not supported currently");
-  }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/CertificateSignRequest.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/CertificateSignRequest.java
index e758f31306..68a0a18fe5 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/CertificateSignRequest.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/CertificateSignRequest.java
@@ -30,17 +30,19 @@ import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
-import org.apache.hadoop.hdds.security.x509.keys.SecurityUtil;
 
 import com.google.common.base.Preconditions;
 import org.apache.logging.log4j.util.Strings;
 import org.bouncycastle.asn1.ASN1EncodableVector;
 import org.bouncycastle.asn1.ASN1Object;
 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.asn1.ASN1Sequence;
+import org.bouncycastle.asn1.ASN1Set;
 import org.bouncycastle.asn1.DEROctetString;
 import org.bouncycastle.asn1.DERSequence;
 import org.bouncycastle.asn1.DERTaggedObject;
 import org.bouncycastle.asn1.DERUTF8String;
+import org.bouncycastle.asn1.pkcs.Attribute;
 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
 import org.bouncycastle.asn1.x500.X500Name;
 import org.bouncycastle.asn1.x509.BasicConstraints;
@@ -66,6 +68,8 @@ import static 
org.apache.hadoop.hdds.security.exception.SCMSecurityException.Err
  * PKCS10CertificationRequest to CertificateServer.
  */
 public final class CertificateSignRequest {
+  // Ozone Certificate distinguished format: (CN=Subject,OU=ScmID,O=ClusterID).
+  private static final String DISTINGUISHED_NAME_FORMAT = "CN=%s,OU=%s,O=%s";
   private final KeyPair keyPair;
   private final SecurityConfig config;
   private final Extensions extensions;
@@ -94,10 +98,46 @@ public final class CertificateSignRequest {
     this.extensions = extensions;
   }
 
+  public static String getDistinguishedNameFormat() {
+    return DISTINGUISHED_NAME_FORMAT;
+  }
+
+  public static X500Name getDistinguishedName(String subject, String scmID,
+      String clusterID) {
+    return new X500Name(String.format(getDistinguishedNameFormat(), subject,
+        scmID, clusterID));
+  }
+
+  public static Extensions getPkcs9Extensions(PKCS10CertificationRequest csr)
+      throws CertificateException {
+    ASN1Set pkcs9ExtReq = getPkcs9ExtRequest(csr);
+    Object extReqElement = pkcs9ExtReq.getObjects().nextElement();
+    if (extReqElement instanceof Extensions) {
+      return (Extensions) extReqElement;
+    } else {
+      if (extReqElement instanceof ASN1Sequence) {
+        return Extensions.getInstance((ASN1Sequence) extReqElement);
+      } else {
+        throw new CertificateException("Unknown element type :" + extReqElement
+            .getClass().getSimpleName());
+      }
+    }
+  }
+
+  public static ASN1Set getPkcs9ExtRequest(PKCS10CertificationRequest csr)
+      throws CertificateException {
+    for (Attribute attr : csr.getAttributes()) {
+      ASN1ObjectIdentifier oid = attr.getAttrType();
+      if (oid.equals(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest)) {
+        return attr.getAttrValues();
+      }
+    }
+    throw new CertificateException("No PKCS#9 extension found in CSR");
+  }
+
   private PKCS10CertificationRequest generateCSR() throws
       OperatorCreationException {
-    X500Name dnName = SecurityUtil.getDistinguishedName(subject, scmID,
-        clusterID);
+    X500Name dnName = getDistinguishedName(subject, scmID, clusterID);
     PKCS10CertificationRequestBuilder p10Builder =
         new JcaPKCS10CertificationRequestBuilder(dnName, keyPair.getPublic());
 
@@ -331,13 +371,12 @@ public final class CertificateSignRequest {
         return csr.generateCSR();
       } catch (IOException ioe) {
         throw new CertificateException(String.format("Unable to create " +
-            "extension for certificate sign request for %s.", SecurityUtil
-            .getDistinguishedName(subject, scmID, clusterID)), ioe.getCause());
+            "extension for certificate sign request for %s.",
+            getDistinguishedName(subject, scmID, clusterID)), ioe.getCause());
       } catch (OperatorCreationException ex) {
         throw new CertificateException(String.format("Unable to create " +
-            "certificate sign request for %s.", SecurityUtil
-            .getDistinguishedName(subject, scmID, clusterID)),
-            ex.getCause());
+            "certificate sign request for %s.",
+            getDistinguishedName(subject, scmID, clusterID)), ex.getCause());
       }
     }
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/SelfSignedCertificate.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/SelfSignedCertificate.java
index db25278c63..a7feb74ce5 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/SelfSignedCertificate.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/utils/SelfSignedCertificate.java
@@ -104,7 +104,7 @@ public final class SelfSignedCertificate {
     return new Builder();
   }
 
-  private X509CertificateHolder generateCertificate(boolean isCA)
+  private X509CertificateHolder generateCertificate(BigInteger caCertSerialId)
       throws OperatorCreationException, IOException {
     // For the Root Certificate we form the name from Subject, SCM ID and
     // Cluster ID.
@@ -119,13 +119,11 @@ public final class SelfSignedCertificate {
         new JcaContentSignerBuilder(config.getSignatureAlgo())
             .setProvider(config.getProvider()).build(key.getPrivate());
 
-    // Please note: Since this is a root certificate we use "ONE" as the
-    // serial number. Also note that skip enforcing locale or UTC. We are
-    // trying to operate at the Days level, hence Time zone is also skipped for
-    // now.
-    BigInteger serial = BigInteger.ONE;
-    if (!isCA) {
+    BigInteger serial;
+    if (caCertSerialId == null) {
       serial = new BigInteger(Long.toString(Time.monotonicNow()));
+    } else {
+      serial = caCertSerialId;
     }
 
     // Valid from the Start of the day when we generate this Certificate.
@@ -139,7 +137,7 @@ public final class SelfSignedCertificate {
     X509v3CertificateBuilder builder = new X509v3CertificateBuilder(name,
         serial, validFrom, validTill, name, publicKeyInfo);
 
-    if (isCA) {
+    if (caCertSerialId != null) {
       builder.addExtension(Extension.basicConstraints, true,
           new BasicConstraints(true));
       int keyUsageFlag = KeyUsage.keyCertSign | KeyUsage.cRLSign;
@@ -170,7 +168,7 @@ public final class SelfSignedCertificate {
     private LocalDateTime endDate;
     private KeyPair key;
     private SecurityConfig config;
-    private boolean isCA;
+    private BigInteger caCertSerialId;
     private List<GeneralName> altNames;
 
     public Builder setConfiguration(ConfigurationSource configuration) {
@@ -209,7 +207,11 @@ public final class SelfSignedCertificate {
     }
 
     public Builder makeCA() {
-      isCA = true;
+      return makeCA(BigInteger.ONE);
+    }
+
+    public Builder makeCA(BigInteger serialId) {
+      this.caCertSerialId = serialId;
       return this;
     }
 
@@ -296,7 +298,7 @@ public final class SelfSignedCertificate {
       SelfSignedCertificate rootCertificate =
           new SelfSignedCertificate(this);
       try {
-        return rootCertificate.generateCertificate(isCA);
+        return rootCertificate.generateCertificate(caCertSerialId);
       } catch (OperatorCreationException | CertIOException e) {
         throw new CertificateException("Unable to create root certificate.",
             e.getCause());
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java
index 6be3e085ce..2740c55c84 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java
@@ -34,66 +34,18 @@ import 
org.apache.hadoop.hdds.security.ssl.PemFileBasedKeyStoresFactory;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
-import org.bouncycastle.asn1.ASN1ObjectIdentifier;
-import org.bouncycastle.asn1.ASN1Sequence;
-import org.bouncycastle.asn1.ASN1Set;
-import org.bouncycastle.asn1.pkcs.Attribute;
-import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
-import org.bouncycastle.asn1.x500.X500Name;
-import org.bouncycastle.asn1.x509.Extensions;
-import org.bouncycastle.pkcs.PKCS10CertificationRequest;
 
 /**
  * Utility functions for Security modules for Ozone.
  */
 public final class SecurityUtil {
 
-  // Ozone Certificate distinguished format: (CN=Subject,OU=ScmID,O=ClusterID).
-  private static final String DISTINGUISHED_NAME_FORMAT = "CN=%s,OU=%s,O=%s";
-
   private SecurityUtil() {
   }
 
-  public static String getDistinguishedNameFormat() {
-    return DISTINGUISHED_NAME_FORMAT;
-  }
-
-  public static X500Name getDistinguishedName(String subject, String scmID,
-      String clusterID) {
-    return new X500Name(String.format(getDistinguishedNameFormat(), subject,
-        scmID, clusterID));
-  }
-
-  // TODO: move the PKCS10CSRValidator class
-  public static Extensions getPkcs9Extensions(PKCS10CertificationRequest csr)
-      throws CertificateException {
-    ASN1Set pkcs9ExtReq = getPkcs9ExtRequest(csr);
-    Object extReqElement = pkcs9ExtReq.getObjects().nextElement();
-    if (extReqElement instanceof Extensions) {
-      return (Extensions) extReqElement;
-    } else {
-      if (extReqElement instanceof ASN1Sequence) {
-        return Extensions.getInstance((ASN1Sequence) extReqElement);
-      } else {
-        throw new CertificateException("Unknown element type :" + extReqElement
-            .getClass().getSimpleName());
-      }
-    }
-  }
-
-  public static ASN1Set getPkcs9ExtRequest(PKCS10CertificationRequest csr)
-      throws CertificateException {
-    for (Attribute attr : csr.getAttributes()) {
-      ASN1ObjectIdentifier oid = attr.getAttrType();
-      if (oid.equals(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest)) {
-        return attr.getAttrValues();
-      }
-    }
-    throw new CertificateException("No PKCS#9 extension found in CSR");
-  }
-
-  /*
+  /**
    * Returns private key created from encoded key.
+   *
    * @return private key if successful else returns null.
    */
   public static PrivateKey getPrivateKey(byte[] encodedKey,
@@ -117,8 +69,9 @@ public final class SecurityUtil {
     return pvtKey;
   }
 
-  /*
+  /**
    * Returns public key created from encoded key.
+   *
    * @return public key if successful else returns null.
    */
   public static PublicKey getPublicKey(byte[] encodedKey,
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java
index 236439a376..2f65db72e2 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java
@@ -30,8 +30,8 @@ import 
org.apache.hadoop.hdds.protocol.datanode.proto.XceiverClientProtocolServi
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
-import org.apache.hadoop.hdds.security.x509.CertificateClientTest;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.container.ContainerTestHelper;
 import org.apache.ratis.thirdparty.io.grpc.ManagedChannel;
 import org.apache.ratis.thirdparty.io.grpc.Server;
@@ -57,7 +57,7 @@ import java.util.concurrent.CompletableFuture;
  */
 public class TestPemFileBasedKeyStoresFactory {
   private OzoneConfiguration conf;
-  private CertificateClientTest caClient;
+  private CertificateClientTestImpl caClient;
   private SecurityConfig secConf;
   private static final int RELOAD_INTERVAL = 2000;
 
@@ -68,7 +68,7 @@ public class TestPemFileBasedKeyStoresFactory {
         RELOAD_INTERVAL);
     conf.setLong(HddsConfigKeys.HDDS_SECURITY_SSL_TRUSTSTORE_RELOAD_INTERVAL,
         RELOAD_INTERVAL);
-    caClient = new CertificateClientTest(conf);
+    caClient = new CertificateClientTestImpl(conf);
     secConf = new SecurityConfig(conf);
   }
   @Test
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java
index 9dbdee1467..22cb621eaa 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java
@@ -19,7 +19,7 @@ package org.apache.hadoop.hdds.security.ssl;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.security.x509.CertificateClientTest;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ozone.test.GenericTestUtils.LogCapturer;
 import org.junit.BeforeClass;
@@ -39,12 +39,12 @@ public class TestReloadingX509KeyManager {
   private final LogCapturer reloaderLog =
       LogCapturer.captureLogs(ReloadingX509KeyManager.LOG);
   private static OzoneConfiguration conf;
-  private static CertificateClientTest caClient;
+  private static CertificateClientTestImpl caClient;
 
   @BeforeClass
   public static void setUp() throws Exception {
     conf = new OzoneConfiguration();
-    caClient = new CertificateClientTest(conf);
+    caClient = new CertificateClientTestImpl(conf);
   }
 
   @Test
@@ -59,6 +59,7 @@ public class TestReloadingX509KeyManager {
       assertEquals(privateKey1,
           km.getPrivateKey(caClient.getComponentName() + "_key"));
 
+      caClient.renewRootCA();
       caClient.renewKey();
       PrivateKey privateKey2 = caClient.getPrivateKey();
       assertNotEquals(privateKey1, privateKey2);
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java
index 9883275873..b136012731 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java
@@ -19,7 +19,7 @@ package org.apache.hadoop.hdds.security.ssl;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.security.x509.CertificateClientTest;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ozone.test.GenericTestUtils.LogCapturer;
 import org.junit.BeforeClass;
@@ -39,12 +39,12 @@ public class TestReloadingX509TrustManager {
   private final LogCapturer reloaderLog =
       LogCapturer.captureLogs(ReloadingX509TrustManager.LOG);
   private static OzoneConfiguration conf;
-  private static CertificateClientTest caClient;
+  private static CertificateClientTestImpl caClient;
 
   @BeforeClass
   public static void setUp() throws Exception {
     conf = new OzoneConfiguration();
-    caClient = new CertificateClientTest(conf);
+    caClient = new CertificateClientTestImpl(conf);
   }
 
   @Test
@@ -59,6 +59,7 @@ public class TestReloadingX509TrustManager {
       X509Certificate cert1 = caClient.getCACertificate();
       assertEquals(cert1, tm.getAcceptedIssuers()[0]);
 
+      caClient.renewRootCA();
       caClient.renewKey();
       X509Certificate cert2 = caClient.getCACertificate();
       assertNotEquals(cert1, cert2);
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
index 00b8b339e9..72aacb4a90 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
@@ -24,7 +24,11 @@ import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.newPutBlockR
 import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.newWriteChunkRequestBuilder;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.AdditionalAnswers.delegatesTo;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import org.apache.hadoop.hdds.HddsConfigKeys;
@@ -54,16 +58,18 @@ import 
org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;
 import org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder;
 import org.bouncycastle.operator.OperatorCreationException;
 import org.bouncycastle.operator.bc.BcRSAContentSignerBuilder;
+import org.bouncycastle.pkcs.PKCS10CertificationRequest;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.Mockito;
+import org.slf4j.Logger;
 
 import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.math.BigInteger;
+import java.nio.file.Path;
 import java.security.KeyPair;
 import java.security.SecureRandom;
 import java.security.Signature;
@@ -106,18 +112,22 @@ public class TestOzoneBlockTokenSecretManager {
     omCertSerialId = x509Certificate.getSerialNumber().toString();
     secretManager = new OzoneBlockTokenSecretManager(securityConfig,
         TimeUnit.HOURS.toMillis(1));
-    client = Mockito.mock(DefaultCertificateClient.class);
-    when(client.getCertificate()).thenReturn(x509Certificate);
-    when(client.getCertificate(anyString())).
-        thenReturn(x509Certificate);
-    when(client.getPublicKey()).thenReturn(keyPair.getPublic());
-    when(client.getPrivateKey()).thenReturn(keyPair.getPrivate());
-    when(client.getSignatureAlgorithm()).thenReturn(
-        securityConfig.getSignatureAlgo());
-    when(client.getSecurityProvider()).thenReturn(
-        securityConfig.getProvider());
-    when(client.verifySignature((byte[]) Mockito.any(),
-        Mockito.any(), Mockito.any())).thenCallRealMethod();
+    Logger log = mock(Logger.class);
+    DefaultCertificateClient toStub =
+        new DefaultCertificateClient(
+            securityConfig, log, null, "test", null, null) {
+          @Override
+          protected String signAndStoreCertificate(
+              PKCS10CertificationRequest request, Path certificatePath) {
+            return null;
+          }
+        };
+    client = mock(DefaultCertificateClient.class, delegatesTo(toStub));
+    doReturn(x509Certificate).when(client).getCertificate();
+    doReturn(x509Certificate).when(client).getCertificate(anyString());
+    doReturn(keyPair.getPublic()).when(client).getPublicKey();
+    doReturn(keyPair.getPrivate()).when(client).getPrivateKey();
+    doReturn(null).when(client).signData(any(byte[].class));
 
     secretManager.start(client);
     tokenVerifier = new BlockTokenVerifier(securityConfig, client);
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/CertificateClientTest.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/CertificateClientTest.java
deleted file mode 100644
index 87ce8b6000..0000000000
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/CertificateClientTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership.  The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations 
under
- * the License.
- */
-package org.apache.hadoop.hdds.security.x509;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.security.KeyPair;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.cert.CertPath;
-import java.security.cert.CertStore;
-import java.security.cert.X509Certificate;
-import java.util.Collections;
-import java.util.List;
-
-import com.google.common.collect.ImmutableList;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory;
-import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateNotification;
-import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
-import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
-import org.apache.hadoop.hdds.security.x509.crl.CRLInfo;
-import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
-
-import org.apache.hadoop.security.ssl.KeyStoreTestUtil;
-import org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory;
-import org.bouncycastle.pkcs.PKCS10CertificationRequest;
-
-/**
- * Test implementation for CertificateClient. To be used only for test
- * purposes.
- */
-
-public class CertificateClientTest implements CertificateClient {
-  private KeyPair keyPair;
-  private CertPath certPath;
-  private SecurityConfig secConfig;
-
-  public CertificateClientTest(OzoneConfiguration conf)
-      throws Exception {
-    secConfig = new SecurityConfig(conf);
-    keyPair = KeyStoreTestUtil.generateKeyPair("RSA");
-    CertificateFactory fact = CertificateCodec.getCertFactory();
-    X509Certificate singleCert = KeyStoreTestUtil
-        .generateCertificate("CN=OzoneMaster", keyPair, 30, "SHA256withRSA");
-    certPath = fact.engineGenerateCertPath(ImmutableList.of(singleCert));
-  }
-
-  @Override
-  public PrivateKey getPrivateKey() {
-    return keyPair.getPrivate();
-  }
-
-  @Override
-  public PublicKey getPublicKey() {
-    return keyPair.getPublic();
-  }
-
-  /**
-   * Returns the certificate  of the specified component if it exists on the
-   * local system.
-   *
-   * @return certificate or Null if there is no data.
-   */
-  @Override
-  public X509Certificate getCertificate(String certSerialId)
-      throws CertificateException {
-    return CertificateCodec.firstCertificateFrom(certPath);
-  }
-
-  @Override
-  public CertPath getCertPath() {
-    return certPath;
-  }
-
-  @Override
-  public X509Certificate getCertificate() {
-    return CertificateCodec.firstCertificateFrom(certPath);
-  }
-
-  @Override
-  public X509Certificate getCACertificate() {
-    return CertificateCodec.firstCertificateFrom(certPath);
-  }
-
-  @Override
-  public CertPath getCACertPath() {
-    return certPath;
-  }
-
-  @Override
-  public boolean verifyCertificate(X509Certificate certificate) {
-    return true;
-  }
-
-  @Override
-  public void setCertificateId(String certSerialId) {
-  }
-
-  @Override
-  public byte[] signDataStream(InputStream stream)
-      throws CertificateException {
-    return new byte[0];
-  }
-
-  @Override
-  public byte[] signData(byte[] data) throws CertificateException {
-    return new byte[0];
-  }
-
-  @Override
-  public boolean verifySignature(InputStream stream, byte[] signature,
-      X509Certificate cert) throws CertificateException {
-    return true;
-  }
-
-  @Override
-  public boolean verifySignature(byte[] data, byte[] signature,
-      X509Certificate cert) throws CertificateException {
-    return true;
-  }
-
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder(KeyPair key)
-      throws IOException {
-    return null;
-  }
-
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder() {
-    return new CertificateSignRequest.Builder();
-  }
-
-  @Override
-  public String signAndStoreCertificate(PKCS10CertificationRequest request,
-      Path certificatePath) throws CertificateException {
-    return null;
-  }
-
-  @Override
-  public String signAndStoreCertificate(PKCS10CertificationRequest request)
-      throws CertificateException {
-    return null;
-  }
-
-  @Override
-  public X509Certificate queryCertificate(String query) {
-    return null;
-  }
-
-  @Override
-  public void storeCertificate(String cert)
-      throws CertificateException {
-  }
-
-  @Override
-  public void storeCertificate(String cert, CAType caType)
-      throws CertificateException {
-  }
-
-  /**
-   * Stores the trusted chain of certificates for a specific component.
-   *
-   * @param keyStore - Cert Store.
-   * @throws CertificateException - on Error.
-   */
-  @Override
-  public void storeTrustChain(CertStore keyStore) throws CertificateException {
-
-  }
-
-  @Override
-  public void storeTrustChain(List<X509Certificate> certificates)
-      throws CertificateException {
-  }
-
-  @Override
-  public InitResponse init() throws CertificateException {
-    return null;
-  }
-
-  @Override
-  public String getSignatureAlgorithm() {
-    return secConfig.getSignatureAlgo();
-  }
-
-  @Override
-  public String getSecurityProvider() {
-    return secConfig.getProvider();
-  }
-
-  @Override
-  public String getComponentName() {
-    return "test";
-  }
-
-  @Override
-  public X509Certificate getRootCACertificate() {
-    return CertificateCodec.firstCertificateFrom(certPath);
-  }
-
-  @Override
-  public void storeRootCACertificate(String pemEncodedCert) {
-
-  }
-
-  @Override
-  public List<String> getCAList() {
-    return null;
-  }
-  @Override
-  public List<String> listCA() throws IOException  {
-    return null;
-  }
-
-  @Override
-  public List<String> updateCAList() throws IOException  {
-    return null;
-  }
-
-  @Override
-  public List<CRLInfo> getCrls(List<Long> crlIds) throws IOException {
-    return Collections.emptyList();
-  }
-
-  @Override
-  public long getLatestCrlId() throws IOException {
-    return 0;
-  }
-
-  @Override
-  public long getLocalCrlId() {
-    return 0;
-  }
-
-  @Override
-  public void setLocalCrlId(long crlId) {
-  }
-
-  @Override
-  public boolean processCrl(CRLInfo crl) {
-    return false;
-  }
-
-  @Override
-  public KeyStoresFactory getServerKeyStoresFactory()
-      throws CertificateException {
-    return null;
-  }
-
-  @Override
-  public KeyStoresFactory getClientKeyStoresFactory()
-      throws CertificateException {
-    return null;
-  }
-
-  @Override
-  public void registerNotificationReceiver(CertificateNotification receiver) {
-  }
-
-  public void renewKey() throws Exception {
-    KeyPair newKeyPair = KeyStoreTestUtil.generateKeyPair("RSA");
-    X509Certificate newCert = KeyStoreTestUtil.generateCertificate(
-        "CN=OzoneMaster", keyPair, 30, "SHA256withRSA");
-
-    keyPair = newKeyPair;
-    CertificateFactory fact = CertificateCodec.getCertFactory();
-    certPath = fact.engineGenerateCertPath(ImmutableList.of(newCert));
-  }
-
-  @Override
-  public void close() throws IOException {
-  }
-}
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/TestDefaultCAServer.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/TestDefaultCAServer.java
index d2f2441fed..e74aa12e5c 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/TestDefaultCAServer.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/TestDefaultCAServer.java
@@ -370,7 +370,7 @@ public class TestDefaultCAServer {
 
     SecurityConfig securityConfig = new SecurityConfig(conf);
     SCMCertificateClient scmCertificateClient =
-        new SCMCertificateClient(new SecurityConfig(conf));
+        new SCMCertificateClient(new SecurityConfig(conf), null);
 
     KeyPair keyPair = KeyStoreTestUtil.generateKeyPair("RSA");
     KeyCodec keyPEMWriter = new KeyCodec(securityConfig,
@@ -421,7 +421,7 @@ public class TestDefaultCAServer {
     CertificateApprover approver = new DefaultApprover(new DefaultCAProfile(),
         securityConfig);
     SCMCertificateClient scmCertificateClient =
-        new SCMCertificateClient(new SecurityConfig(conf));
+        new SCMCertificateClient(new SecurityConfig(conf), null);
     String scmId = RandomStringUtils.randomAlphabetic(4);
     String clusterId = RandomStringUtils.randomAlphabetic(4);
     KeyPair keyPair = new HDDSKeyGenerator(conf).generateKey();
@@ -485,7 +485,7 @@ public class TestDefaultCAServer {
 
 
     SCMCertificateClient scmCertificateClient =
-        new SCMCertificateClient(new SecurityConfig(conf));
+        new SCMCertificateClient(new SecurityConfig(conf), null);
 
     CertificateClient.InitResponse response = scmCertificateClient.init();
     assertEquals(CertificateClient.InitResponse.GETCERT, response);
@@ -525,7 +525,7 @@ public class TestDefaultCAServer {
 
     // Write to the location where Default CA Server reads from.
     scmCertificateClient.storeCertificate(
-        CertificateCodec.getPEMEncodedString(certificateHolder));
+        CertificateCodec.getPEMEncodedString(certificateHolder), CAType.NONE);
 
     CertificateCodec certCodec =
         new CertificateCodec(new SecurityConfig(conf),
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/CertificateClientTestImpl.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java
similarity index 81%
rename from 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/CertificateClientTestImpl.java
rename to 
hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java
index f13e830cc0..6f8abe1cbc 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/CertificateClientTestImpl.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java
@@ -14,11 +14,10 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.hadoop.ozone.client;
+package org.apache.hadoop.hdds.security.x509.certificate.client;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
+import java.math.BigInteger;
 import java.security.InvalidKeyException;
 import java.security.KeyPair;
 import java.security.NoSuchAlgorithmException;
@@ -28,12 +27,10 @@ import java.security.PublicKey;
 import java.security.Signature;
 import java.security.SignatureException;
 import java.security.cert.CertPath;
-import java.security.cert.CertStore;
 import java.security.cert.X509Certificate;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -51,11 +48,8 @@ import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.DefaultApprover;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.profile.DefaultProfile;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateNotification;
 import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
 import 
org.apache.hadoop.hdds.security.x509.certificate.utils.SelfSignedCertificate;
-import org.apache.hadoop.hdds.security.x509.crl.CRLInfo;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
 import org.apache.hadoop.hdds.security.x509.keys.HDDSKeyGenerator;
 
@@ -81,8 +75,8 @@ public class CertificateClientTestImpl implements 
CertificateClient {
   private final SecurityConfig securityConfig;
   private KeyPair keyPair;
   private X509Certificate x509Certificate;
-  private final KeyPair rootKeyPair;
-  private final X509Certificate rootCert;
+  private KeyPair rootKeyPair;
+  private X509Certificate rootCert;
   private HDDSKeyGenerator keyGen;
   private DefaultApprover approver;
   private KeyStoresFactory serverKeyStoresFactory;
@@ -127,7 +121,8 @@ public class CertificateClientTestImpl implements 
CertificateClient {
     // Generate normal certificate, signed by RootCA certificate
     approver = new DefaultApprover(new DefaultProfile(), securityConfig);
 
-    CertificateSignRequest.Builder csrBuilder = getCSRBuilder();
+    CertificateSignRequest.Builder csrBuilder =
+        new CertificateSignRequest.Builder();
     // Get host name.
     csrBuilder.setKey(keyPair)
         .setConfiguration(config)
@@ -217,38 +212,17 @@ public class CertificateClientTestImpl implements 
CertificateClient {
     return rootCert;
   }
 
-  @Override
-  public boolean verifyCertificate(X509Certificate certificate) {
-    return true;
-  }
-
-  @Override
-  public void setCertificateId(String certSerialId) {
-  }
-
-  @Override
-  public byte[] signDataStream(InputStream stream)
-      throws CertificateException {
-    return new byte[0];
-  }
-
   @Override
   public byte[] signData(byte[] data) throws CertificateException {
     return new byte[0];
   }
 
-  @Override
-  public boolean verifySignature(InputStream stream, byte[] signature,
-      X509Certificate cert) throws CertificateException {
-    return true;
-  }
-
   @Override
   public boolean verifySignature(byte[] data, byte[] signature,
       X509Certificate cert) throws CertificateException {
     try {
-      Signature sign = Signature.getInstance(getSignatureAlgorithm(),
-          getSecurityProvider());
+      Signature sign = Signature.getInstance(securityConfig.getSignatureAlgo(),
+          securityConfig.getProvider());
       sign.initVerify(cert);
       sign.update(data);
       return sign.verify(signature);
@@ -260,76 +234,27 @@ public class CertificateClientTestImpl implements 
CertificateClient {
     }
   }
 
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder(KeyPair key)
-      throws CertificateException {
-    return null;
-  }
-
   @Override
   public CertificateSignRequest.Builder getCSRBuilder() {
     return new CertificateSignRequest.Builder();
   }
 
-  @Override
-  public String signAndStoreCertificate(PKCS10CertificationRequest request,
-      Path certPath) throws CertificateException {
-    return null;
-  }
-
   @Override
   public String signAndStoreCertificate(PKCS10CertificationRequest request)
       throws CertificateException {
     return null;
   }
 
-  @Override
-  public X509Certificate queryCertificate(String query) {
-    return null;
-  }
-
-  @Override
-  public void storeCertificate(String cert)
-      throws CertificateException {
-  }
-
   @Override
   public void storeCertificate(String cert, CAType caType)
       throws CertificateException {
   }
 
-  /**
-   * Stores the trusted chain of certificates for a specific component.
-   *
-   * @param keyStore - Cert Store.
-   * @throws CertificateException - on Error.
-   */
-  @Override
-  public void storeTrustChain(CertStore keyStore) throws CertificateException {
-
-  }
-
-  @Override
-  public void storeTrustChain(List<X509Certificate> certificates)
-      throws CertificateException {
-
-  }
-
   @Override
   public InitResponse init() throws CertificateException {
     return null;
   }
 
-  @Override
-  public String getSignatureAlgorithm() {
-    return securityConfig.getSignatureAlgo();
-  }
-
-  @Override
-  public String getSecurityProvider() {
-    return securityConfig.getProvider();
-  }
-
   @Override
   public String getComponentName() {
     return this.getClass().getSimpleName();
@@ -340,11 +265,6 @@ public class CertificateClientTestImpl implements 
CertificateClient {
     return x509Certificate;
   }
 
-  @Override
-  public void storeRootCACertificate(String pemEncodedCert) {
-
-  }
-
   @Override
   public List<String> getCAList() {
     return null;
@@ -359,33 +279,31 @@ public class CertificateClientTestImpl implements 
CertificateClient {
     return null;
   }
 
-  @Override
-  public List<CRLInfo> getCrls(List<Long> crlIds) throws IOException {
-    return Collections.emptyList();
-  }
-
-  @Override
-  public long getLatestCrlId() throws IOException {
-    return 0;
-  }
-
-  @Override
-  public long getLocalCrlId() {
-    return 0;
-  }
-
-  @Override
-  public void setLocalCrlId(long crlId) {
-  }
-
-  @Override
-  public boolean processCrl(CRLInfo crl) {
-    return false;
+  public void renewRootCA() throws Exception {
+    LocalDateTime start = LocalDateTime.now();
+    String rootCACertDuration = config.get(HDDS_X509_MAX_DURATION,
+        HDDS_X509_MAX_DURATION_DEFAULT);
+    LocalDateTime end = start.plus(Duration.parse(rootCACertDuration));
+    rootKeyPair = keyGen.generateKey();
+    SelfSignedCertificate.Builder builder =
+        SelfSignedCertificate.newBuilder()
+            .setBeginDate(start)
+            .setEndDate(end)
+            .setClusterID("cluster1")
+            .setKey(rootKeyPair)
+            .setSubject("rootCA-new@localhost")
+            .setConfiguration(config)
+            .setScmID("scm1")
+            .makeCA(BigInteger.ONE.add(BigInteger.ONE));
+    rootCert = new JcaX509CertificateConverter().getCertificate(
+        builder.build());
+    certificateMap.put(rootCert.getSerialNumber().toString(), rootCert);
   }
 
   public void renewKey() throws Exception {
     KeyPair newKeyPair = keyGen.generateKey();
-    CertificateSignRequest.Builder csrBuilder = getCSRBuilder();
+    CertificateSignRequest.Builder csrBuilder =
+        new CertificateSignRequest.Builder();
     // Get host name.
     csrBuilder.setKey(newKeyPair)
         .setConfiguration(config)
@@ -427,6 +345,7 @@ public class CertificateClientTestImpl implements 
CertificateClient {
     @Override
     public void run() {
       try {
+        renewRootCA();
         renewKey();
       } catch (Exception e) {
         throw new RuntimeException(e);
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/TestDefaultCertificateClient.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/TestDefaultCertificateClient.java
index 46192d91ad..d7ada90e25 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/TestDefaultCertificateClient.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/TestDefaultCertificateClient.java
@@ -25,7 +25,6 @@ import 
org.apache.hadoop.hdds.protocolPB.SCMSecurityProtocolClientSideTranslator
 import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient.InitResponse;
 import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
-import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
 import org.apache.hadoop.hdds.security.x509.keys.KeyCodec;
 import org.bouncycastle.cert.X509CertificateHolder;
@@ -51,7 +50,6 @@ import java.util.Date;
 import java.util.UUID;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 
 
@@ -208,11 +206,10 @@ public class TestDefaultCertificateClient {
     // Expect error when there is no private key to sign.
     LambdaTestUtils.intercept(IOException.class, "Error while " +
             "signing the stream",
-        () -> dnCertClient.signDataStream(IOUtils.toInputStream(data, UTF_8)));
+        () -> dnCertClient.signData(data.getBytes(UTF_8)));
 
     generateKeyPairFiles();
-    byte[] sign = dnCertClient.signDataStream(IOUtils.toInputStream(data,
-        UTF_8));
+    byte[] sign = dnCertClient.signData(data.getBytes(UTF_8));
     validateHash(sign, data.getBytes(UTF_8));
   }
 
@@ -235,21 +232,15 @@ public class TestDefaultCertificateClient {
   @Test
   public void verifySignatureStream() throws Exception {
     String data = RandomStringUtils.random(500);
-    byte[] sign = dnCertClient.signDataStream(IOUtils.toInputStream(data,
-        UTF_8));
+    byte[] sign = dnCertClient.signData(data.getBytes(UTF_8));
 
     // Positive tests.
     assertTrue(dnCertClient.verifySignature(data.getBytes(UTF_8), sign,
         x509Certificate));
-    assertTrue(dnCertClient.verifySignature(
-        IOUtils.toInputStream(data, UTF_8),
-        sign, x509Certificate));
 
     // Negative tests.
     assertFalse(dnCertClient.verifySignature(data.getBytes(UTF_8),
         "abc".getBytes(UTF_8), x509Certificate));
-    assertFalse(dnCertClient.verifySignature(IOUtils.toInputStream(data,
-        UTF_8), "abc".getBytes(UTF_8), x509Certificate));
 
   }
 
@@ -264,23 +255,10 @@ public class TestDefaultCertificateClient {
     // Positive tests.
     assertTrue(dnCertClient.verifySignature(data.getBytes(UTF_8), sign,
         x509Certificate));
-    assertTrue(dnCertClient.verifySignature(
-        IOUtils.toInputStream(data, UTF_8),
-        sign, x509Certificate));
 
     // Negative tests.
     assertFalse(dnCertClient.verifySignature(data.getBytes(UTF_8),
         "abc".getBytes(UTF_8), x509Certificate));
-    assertFalse(dnCertClient.verifySignature(IOUtils.toInputStream(data,
-        UTF_8), "abc".getBytes(UTF_8), x509Certificate));
-
-  }
-
-  @Test
-  public void queryCertificate() throws Exception {
-    LambdaTestUtils.intercept(UnsupportedOperationException.class,
-        "Operation not supported",
-        () -> dnCertClient.queryCertificate(""));
   }
 
   @Test
@@ -334,9 +312,9 @@ public class TestDefaultCertificateClient {
     X509Certificate cert2 = generateX509Cert(keyPair);
     X509Certificate cert3 = generateX509Cert(keyPair);
 
-    dnCertClient.storeCertificate(getPEMEncodedString(cert1));
-    dnCertClient.storeCertificate(getPEMEncodedString(cert2));
-    dnCertClient.storeCertificate(getPEMEncodedString(cert3));
+    dnCertClient.storeCertificate(getPEMEncodedString(cert1), CAType.NONE);
+    dnCertClient.storeCertificate(getPEMEncodedString(cert2), CAType.NONE);
+    dnCertClient.storeCertificate(getPEMEncodedString(cert3), CAType.NONE);
 
     assertNotNull(dnCertClient.getCertificate(cert1.getSerialNumber()
         .toString()));
@@ -455,12 +433,6 @@ public class TestDefaultCertificateClient {
               throws CertificateException {
             return null;
           }
-
-          @Override
-          public CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
-              throws CertificateException {
-            return null;
-          }
         };
 
     InitResponse resp = client.init();
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/utils/TestCertificateSignRequest.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/utils/TestCertificateSignRequest.java
index 82f22e03d5..43981183aa 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/utils/TestCertificateSignRequest.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/utils/TestCertificateSignRequest.java
@@ -22,7 +22,6 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import org.apache.hadoop.hdds.security.x509.keys.HDDSKeyGenerator;
-import org.apache.hadoop.hdds.security.x509.keys.SecurityUtil;
 import org.bouncycastle.asn1.ASN1Encodable;
 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
 import org.bouncycastle.asn1.ASN1Sequence;
@@ -52,6 +51,8 @@ import java.util.Iterator;
 import java.util.UUID;
 
 import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
+import static 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest.getDistinguishedNameFormat;
+import static 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest.getPkcs9Extensions;
 
 /**
  * Certificate Signing Request.
@@ -88,7 +89,7 @@ public class TestCertificateSignRequest {
     PKCS10CertificationRequest csr = builder.build();
 
     // Check the Subject Name is in the expected format.
-    String dnName = String.format(SecurityUtil.getDistinguishedNameFormat(),
+    String dnName = String.format(getDistinguishedNameFormat(),
         subject, scmID, clusterID);
     Assertions.assertEquals(dnName, csr.getSubject().toString());
 
@@ -101,7 +102,7 @@ public class TestCertificateSignRequest {
 
     // Verify CSR with attribute for extensions
     Assertions.assertEquals(1, csr.getAttributes().length);
-    Extensions extensions = SecurityUtil.getPkcs9Extensions(csr);
+    Extensions extensions = getPkcs9Extensions(csr);
 
     // Verify key usage extension
     Extension keyUsageExt = extensions.getExtension(Extension.keyUsage);
@@ -148,7 +149,7 @@ public class TestCertificateSignRequest {
     PKCS10CertificationRequest csr = builder.build();
 
     // Check the Subject Name is in the expected format.
-    String dnName = String.format(SecurityUtil.getDistinguishedNameFormat(),
+    String dnName = String.format(getDistinguishedNameFormat(),
         subject, scmID, clusterID);
     Assertions.assertEquals(dnName, csr.getSubject().toString());
 
@@ -161,7 +162,7 @@ public class TestCertificateSignRequest {
 
     // Verify CSR with attribute for extensions
     Assertions.assertEquals(1, csr.getAttributes().length);
-    Extensions extensions = SecurityUtil.getPkcs9Extensions(csr);
+    Extensions extensions = getPkcs9Extensions(csr);
 
     // Verify key usage extension
     Extension sanExt = extensions.getExtension(Extension.keyUsage);
@@ -230,7 +231,7 @@ public class TestCertificateSignRequest {
     PKCS10CertificationRequest csr = builder.build();
 
     // Check the Subject Name is in the expected format.
-    String dnName = String.format(SecurityUtil.getDistinguishedNameFormat(),
+    String dnName = String.format(getDistinguishedNameFormat(),
         subject, scmID, clusterID);
     Assertions.assertEquals(dnName, csr.getSubject().toString());
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java
index caa48b27ed..59618ee5d6 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java
@@ -52,7 +52,6 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
-import java.security.KeyPair;
 import java.security.cert.CertPath;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
@@ -93,7 +92,8 @@ public final class HASecurityUtils {
     LOG.info("Initializing secure StorageContainerManager.");
 
     CertificateClient certClient =
-        new SCMCertificateClient(new SecurityConfig(conf));
+        new SCMCertificateClient(
+            new SecurityConfig(conf), scmStorageConfig.getScmId());
     InitResponse response = certClient.init();
     LOG.info("Init response: {}", response);
     switch (response) {
@@ -157,7 +157,7 @@ public final class HASecurityUtils {
         String pemEncodedRootCert = response.getX509CACertificate();
         client.storeCertificate(
             pemEncodedRootCert, CAType.SUBORDINATE);
-        client.storeCertificate(pemEncodedCert);
+        client.storeCertificate(pemEncodedCert, CAType.NONE);
         //note: this does exactly the same as store certificate
         persistSubCACertificate(config, client,
             pemEncodedCert);
@@ -208,7 +208,7 @@ public final class HASecurityUtils {
 
       client.storeCertificate(
           pemEncodedRootCert, CAType.SUBORDINATE);
-      client.storeCertificate(pemEncodedCert);
+      client.storeCertificate(pemEncodedCert, CAType.NONE);
       //note: this does exactly the same as store certificate
       persistSubCACertificate(config, client, pemEncodedCert);
       X509Certificate cert =
@@ -262,15 +262,13 @@ public final class HASecurityUtils {
       OzoneConfiguration config, InetSocketAddress scmAddress)
       throws IOException {
     CertificateSignRequest.Builder builder = client.getCSRBuilder();
-    KeyPair keyPair = new KeyPair(client.getPublicKey(),
-        client.getPrivateKey());
 
     // Get host name.
     String hostname = scmAddress.getHostName();
 
     String subject = SCM_SUB_CA_PREFIX + hostname;
 
-    builder.setKey(keyPair)
+    builder
         .setConfiguration(config)
         .setScmID(scmStorageConfig.getScmId())
         .setClusterID(scmStorageConfig.getClusterID())
diff --git a/hadoop-ozone/integration-test/pom.xml 
b/hadoop-ozone/integration-test/pom.xml
index fca6f3c573..0a35660a39 100644
--- a/hadoop-ozone/integration-test/pom.xml
+++ b/hadoop-ozone/integration-test/pom.xml
@@ -43,6 +43,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd";>
       <groupId>org.apache.ozone</groupId>
       <artifactId>hdds-server-scm</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.ozone</groupId>
+      <artifactId>hdds-server-framework</artifactId>
+      <version>${hdds.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.ozone</groupId>
       <artifactId>ozone-manager</artifactId>
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
index 96c601cbd0..d1a98e890d 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
@@ -48,9 +48,9 @@ import 
org.apache.hadoop.hdds.security.token.ContainerTokenSecretManager;
 import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
index dc6e237591..2484af75fa 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
@@ -32,13 +32,13 @@ import org.apache.hadoop.hdds.scm.ScmConfig;
 import org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.hdds.security.x509.keys.HDDSKeyGenerator;
 import org.apache.hadoop.hdds.security.x509.keys.KeyCodec;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.ipc.Server;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.minikdc.MiniKdc;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.om.OMStorage;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
index 8f7b82b140..b2ad993b9f 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
@@ -70,6 +70,7 @@ import 
org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.DefaultApprover;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.profile.DefaultProfile;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.DNCertificateClient;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.DefaultCAServer;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.DefaultCertificateClient;
@@ -87,7 +88,6 @@ import org.apache.hadoop.ipc.Server;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.net.NetUtils;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneClientFactory;
 import org.apache.hadoop.ozone.common.Storage;
@@ -904,21 +904,23 @@ public final class TestSecureOzoneCluster {
     OzoneManager.setTestSecureOmFlag(true);
 
     SecurityConfig securityConfig = new SecurityConfig(conf);
-    CertificateCodec certCodec = new CertificateCodec(securityConfig, "om");
-    OMCertificateClient client =
-        new OMCertificateClient(securityConfig, omStorage, scmId);
-    client.init();
+
 
     // save first cert
     final int certificateLifetime = 20; // seconds
+    KeyCodec keyCodec =
+        new KeyCodec(securityConfig, securityConfig.getKeyLocation("om"));
     X509CertificateHolder certHolder = generateX509CertHolder(conf,
-        new KeyPair(client.getPublicKey(), client.getPrivateKey()),
+        new KeyPair(keyCodec.readPublicKey(), keyCodec.readPrivateKey()),
         null, Duration.ofSeconds(certificateLifetime));
     String certId = certHolder.getSerialNumber().toString();
-    certCodec.writeCertificate(certHolder);
-    client.setCertificateId(certId);
     omStorage.setOmCertSerialId(certId);
     omStorage.forceInitialize();
+    CertificateCodec certCodec = new CertificateCodec(securityConfig, "om");
+    certCodec.writeCertificate(certHolder);
+    OMCertificateClient client =
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
+    client.init();
 
     // first renewed cert
     X509CertificateHolder newCertHolder = generateX509CertHolder(conf,
@@ -981,21 +983,23 @@ public final class TestSecureOzoneCluster {
 
     SecurityConfig securityConfig = new SecurityConfig(conf);
     CertificateCodec certCodec = new CertificateCodec(securityConfig, "om");
-    OMCertificateClient client =
-        new OMCertificateClient(securityConfig, omStorage, scmId);
-    client.init();
 
     // save first cert
     final int certificateLifetime = 20; // seconds
+    KeyCodec keyCodec =
+        new KeyCodec(securityConfig, securityConfig.getKeyLocation("om"));
     X509CertificateHolder certHolder = generateX509CertHolder(conf,
-        new KeyPair(client.getPublicKey(), client.getPrivateKey()),
+        new KeyPair(keyCodec.readPublicKey(), keyCodec.readPrivateKey()),
         null, Duration.ofSeconds(certificateLifetime));
     String certId = certHolder.getSerialNumber().toString();
     certCodec.writeCertificate(certHolder);
-    client.setCertificateId(certId);
     omStorage.setOmCertSerialId(certId);
     omStorage.forceInitialize();
 
+    OMCertificateClient client =
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
+    client.init();
+
     // prepare a mocked scmClient to certificate signing
     SCMSecurityProtocolClientSideTranslatorPB scmClient =
         mock(SCMSecurityProtocolClientSideTranslatorPB.class);
@@ -1070,7 +1074,7 @@ public final class TestSecureOzoneCluster {
     SecurityConfig securityConfig = new SecurityConfig(conf);
     CertificateCodec certCodec = new CertificateCodec(securityConfig, "om");
     OMCertificateClient client =
-        new OMCertificateClient(securityConfig, omStorage, scmId);
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
     client.init();
 
     // save first cert
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
index 2fcb41e281..3e19a4577c 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
@@ -31,9 +31,9 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
 import org.apache.hadoop.hdds.scm.OzoneClientConfig;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneClientFactory;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFlushDelay.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFlushDelay.java
index 244bee7d01..a7dc787a8b 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFlushDelay.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFlushDelay.java
@@ -23,9 +23,9 @@ import org.apache.hadoop.hdds.client.ReplicationFactor;
 import org.apache.hadoop.hdds.client.ReplicationType;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneClientFactory;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneAtRestEncryption.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneAtRestEncryption.java
index 9a649b07f8..479eea5f7f 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneAtRestEncryption.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneAtRestEncryption.java
@@ -47,10 +47,10 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import 
org.apache.hadoop.hdds.scm.protocolPB.StorageContainerLocationProtocolClientSideTranslatorPB;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.client.BucketArgs;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
index f8070eb68d..b8fc491769 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
@@ -28,6 +28,7 @@ import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import 
org.apache.hadoop.hdds.scm.protocolPB.StorageContainerLocationProtocolClientSideTranslatorPB;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.TableIterator;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
@@ -35,7 +36,6 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
index 551cf9aef0..c3f4902d00 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
@@ -30,9 +30,9 @@ import org.apache.hadoop.hdds.scm.pipeline.MockPipeline;
 import org.apache.hadoop.hdds.security.token.ContainerTokenIdentifier;
 import org.apache.hadoop.hdds.security.token.ContainerTokenSecretManager;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.container.ContainerTestHelper;
 import org.apache.hadoop.hdds.scm.XceiverClientGrpc;
 import org.apache.hadoop.hdds.scm.XceiverClientSpi;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
index ca722cf442..ba741a71f4 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
@@ -30,10 +30,10 @@ import 
org.apache.hadoop.hdds.security.exception.SCMSecurityException;
 import org.apache.hadoop.hdds.security.token.ContainerTokenIdentifier;
 import org.apache.hadoop.hdds.security.token.ContainerTokenSecretManager;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.hdds.scm.XceiverClientGrpc;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
index 8be6d4e59c..1890a95daa 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
@@ -49,10 +49,10 @@ import 
org.apache.hadoop.hdds.security.token.OzoneBlockTokenIdentifier;
 import org.apache.hadoop.hdds.security.token.ContainerTokenSecretManager;
 import org.apache.hadoop.hdds.security.token.TokenVerifier;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.ozone.RatisTestHelper;
-import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
 import org.apache.hadoop.ozone.container.common.helpers.ContainerMetrics;
 import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
 import org.apache.hadoop.ozone.container.common.impl.HddsDispatcher;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestSecureOzoneManager.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestSecureOzoneManager.java
index 1871fb1bc2..00667432e4 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestSecureOzoneManager.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestSecureOzoneManager.java
@@ -122,7 +122,7 @@ public class TestSecureOzoneManager {
     // boot-up. Get certificate will fail when SCM is not running.
     SecurityConfig securityConfig = new SecurityConfig(conf);
     CertificateClient client =
-        new OMCertificateClient(securityConfig, omStorage, scmId);
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
     Assert.assertEquals(CertificateClient.InitResponse.GETCERT, client.init());
     privateKey = client.getPrivateKey();
     publicKey = client.getPublicKey();
@@ -131,14 +131,16 @@ public class TestSecureOzoneManager {
     Assert.assertNull(client.getCertificate());
 
     // Case 2: If key pair already exist than response should be RECOVER.
-    client = new OMCertificateClient(securityConfig, omStorage, scmId);
+    client =
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
     Assert.assertEquals(CertificateClient.InitResponse.RECOVER, client.init());
     Assert.assertNotNull(client.getPrivateKey());
     Assert.assertNotNull(client.getPublicKey());
     Assert.assertNull(client.getCertificate());
 
     // Case 3: When public key as well as certificate is missing.
-    client = new OMCertificateClient(securityConfig);
+    client =
+        new OMCertificateClient(securityConfig, omStorage, null, null, null);
     FileUtils.deleteQuietly(Paths.get(securityConfig.getKeyLocation(COMPONENT)
         .toString(), securityConfig.getPublicKeyFileName()).toFile());
     Assert.assertEquals(CertificateClient.InitResponse.FAILURE, client.init());
@@ -147,7 +149,8 @@ public class TestSecureOzoneManager {
     Assert.assertNull(client.getCertificate());
 
     // Case 4: When private key and certificate is missing.
-    client = new OMCertificateClient(securityConfig);
+    client =
+        new OMCertificateClient(securityConfig, omStorage, null, null, null);
     KeyCodec keyCodec = new KeyCodec(securityConfig, COMPONENT);
     keyCodec.writePublicKey(publicKey);
     FileUtils.deleteQuietly(Paths.get(securityConfig.getKeyLocation(COMPONENT)
@@ -168,14 +171,16 @@ public class TestSecureOzoneManager {
     certCodec.writeCertificate(new X509CertificateHolder(
         x509Certificate.getEncoded()));
     omStorage.setOmCertSerialId(x509Certificate.getSerialNumber().toString());
-    client = new OMCertificateClient(securityConfig, omStorage, scmId);
+    client =
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
     Assert.assertEquals(CertificateClient.InitResponse.FAILURE, client.init());
     Assert.assertNull(client.getPrivateKey());
     Assert.assertNull(client.getPublicKey());
     Assert.assertNotNull(client.getCertificate());
 
     // Case 6: When private key and certificate is present.
-    client = new OMCertificateClient(securityConfig, omStorage, scmId);
+    client =
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
     FileUtils.deleteQuietly(Paths.get(securityConfig.getKeyLocation(COMPONENT)
         .toString(), securityConfig.getPublicKeyFileName()).toFile());
     keyCodec.writePrivateKey(privateKey);
@@ -185,7 +190,8 @@ public class TestSecureOzoneManager {
     Assert.assertNotNull(client.getCertificate());
 
     // Case 7 When keypair and certificate is present.
-    client = new OMCertificateClient(securityConfig, omStorage, scmId);
+    client =
+        new OMCertificateClient(securityConfig, omStorage, scmId, null, null);
     Assert.assertEquals(CertificateClient.InitResponse.SUCCESS, client.init());
     Assert.assertNotNull(client.getPrivateKey());
     Assert.assertNotNull(client.getPublicKey());
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 6c45d4444e..ac4c716579 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -68,6 +68,7 @@ import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
 import org.apache.hadoop.hdds.client.ReplicationType;
 import org.apache.hadoop.hdds.conf.ConfigurationException;
+import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.ReconfigureProtocol;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
@@ -1320,14 +1321,15 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
     LOG.info("Initializing secure OzoneManager.");
 
     CertificateClient certClient =
-        new OMCertificateClient(new SecurityConfig(conf), omStore, scmId);
+        new OMCertificateClient(
+            new SecurityConfig(conf), omStore, scmId, null, null);
     CertificateClient.InitResponse response = certClient.init();
     if (response.equals(CertificateClient.InitResponse.REINIT)) {
       LOG.info("Re-initialize certificate client.");
       omStore.unsetOmCertSerialId();
       omStore.persistCurrentState();
       certClient = new OMCertificateClient(
-          new SecurityConfig(conf), omStore, scmId);
+          new SecurityConfig(conf), omStore, scmId, null, null);
       response = certClient.init();
     }
     LOG.info("Init response: {}", response);
@@ -4408,7 +4410,7 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
   }
 
   public static HddsProtos.OzoneManagerDetailsProto getOmDetailsProto(
-      OzoneConfiguration config, String omID) {
+      ConfigurationSource config, String omID) {
     boolean flexibleFqdnResolutionEnabled = config.getBoolean(
         OZONE_FLEXIBLE_FQDN_RESOLUTION_ENABLED,
         OZONE_FLEXIBLE_FQDN_RESOLUTION_ENABLED_DEFAULT);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OMCertificateClient.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OMCertificateClient.java
index 7069181793..73d54d0e7a 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OMCertificateClient.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OMCertificateClient.java
@@ -20,7 +20,6 @@
 package org.apache.hadoop.ozone.security;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import 
org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetCertResponseProto;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
@@ -30,7 +29,6 @@ import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
 import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
 import org.apache.hadoop.ozone.om.OMStorage;
-import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.ha.OMHANodeDetails;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.bouncycastle.pkcs.PKCS10CertificationRequest;
@@ -43,6 +41,7 @@ import java.security.KeyPair;
 import java.util.function.Consumer;
 
 import static 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest.getEncodedString;
+import static org.apache.hadoop.ozone.om.OzoneManager.getOmDetailsProto;
 
 /**
  * Certificate client for OzoneManager.
@@ -57,59 +56,19 @@ public class OMCertificateClient extends 
CommonCertificateClient {
   private final String clusterID;
   private final HddsProtos.OzoneManagerDetailsProto omInfo;
 
-  @SuppressWarnings("parameternumber")
-  public OMCertificateClient(SecurityConfig secConfig, String scmId,
-      String clusterId, HddsProtos.OzoneManagerDetailsProto omDetails,
-      String certSerialId, String localCrlId,
-      Consumer<String> persistCertIdCallback, Runnable shutdownCallback) {
-    super(secConfig, LOG, certSerialId, COMPONENT_NAME, persistCertIdCallback,
-        shutdownCallback);
-    this.setLocalCrlId(localCrlId != null ?
-        Long.parseLong(localCrlId) : 0);
-    this.scmID = scmId;
-    this.clusterID = clusterId;
-    this.omInfo = omDetails;
-  }
-
-  public OMCertificateClient(SecurityConfig secConfig,
-      OMStorage omStorage, String scmID, Consumer<String> saveCertIdCallback,
-      Runnable shutdownCallback) {
-    this(secConfig, scmID, omStorage.getClusterID(),
-        OzoneManager.getOmDetailsProto(
-            (OzoneConfiguration) secConfig.getConfiguration(),
-            omStorage.getOmId()),
-        omStorage.getOmCertSerialId(), null,
+  public OMCertificateClient(
+      SecurityConfig secConfig,
+      OMStorage omStorage,
+      String scmID,
+      Consumer<String> saveCertIdCallback,
+      Runnable shutdownCallback
+  ) {
+    super(secConfig, LOG, omStorage.getOmCertSerialId(), COMPONENT_NAME,
         saveCertIdCallback, shutdownCallback);
-  }
-
-  public OMCertificateClient(SecurityConfig secConfig, OMStorage omStorage,
-      String scmID) {
-    this(secConfig, scmID, omStorage.getClusterID(),
-        OzoneManager.getOmDetailsProto(
-            (OzoneConfiguration) secConfig.getConfiguration(),
-            omStorage.getOmId()),
-        omStorage.getOmCertSerialId(), null, null, null);
-  }
-
-  public OMCertificateClient(SecurityConfig secConfig) {
-    this(secConfig, null, null, null, null, null, null, null);
-  }
-
-  public OMCertificateClient(SecurityConfig secConfig, String certSerialId) {
-    this(secConfig, null, null, null, certSerialId, null, null, null);
-  }
-
-  /**
-   * Returns a CSR builder that can be used to create a Certificate signing
-   * request.
-   * The default flag is added to allow basic SSL handshake.
-   *
-   * @return CertificateSignRequest.Builder
-   */
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder()
-      throws CertificateException {
-    return getCSRBuilder(new KeyPair(getPublicKey(), getPrivateKey()));
+    this.scmID = scmID;
+    this.clusterID = omStorage.getClusterID();
+    this.omInfo =
+        getOmDetailsProto(secConfig.getConfiguration(), omStorage.getOmId());
   }
 
   /**
@@ -119,7 +78,7 @@ public class OMCertificateClient extends 
CommonCertificateClient {
    * @return CertificateSignRequest.Builder
    */
   @Override
-  public CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
+  public CertificateSignRequest.Builder getCSRBuilder()
       throws CertificateException {
     CertificateSignRequest.Builder builder = super.getCSRBuilder()
         .setDigitalEncryption(true)
@@ -141,7 +100,7 @@ public class OMCertificateClient extends 
CommonCertificateClient {
     }
 
     builder.setCA(false)
-        .setKey(keyPair)
+        .setKey(new KeyPair(getPublicKey(), getPrivateKey()))
         .setConfiguration(getConfig())
         .setScmID(scmID)
         .setClusterID(clusterID)
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
index 94eb040795..0e1e004a0e 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hdds.HddsConfigKeys;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.utils.TransactionInfo;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import org.apache.hadoop.ozone.om.OMStorage;
 import org.apache.hadoop.ozone.security.OMCertificateClient;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.OzoneConsts;
@@ -61,6 +62,7 @@ import org.slf4j.LoggerFactory;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.hadoop.ozone.OzoneConsts.TRANSACTION_INFO_KEY;
 import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 /**
@@ -109,6 +111,10 @@ public class TestOzoneManagerRatisServer {
         .setOMNodeId(omID)
         .setOMServiceId(OzoneConsts.OM_SERVICE_ID_DEFAULT)
         .build();
+    OMStorage omStorage = mock(OMStorage.class);
+    when(omStorage.getOmCertSerialId()).thenReturn(null);
+    when(omStorage.getClusterID()).thenReturn("test");
+    when(omStorage.getOmId()).thenReturn(UUID.randomUUID().toString());
     // Starts a single node Ratis server
     ozoneManager = Mockito.mock(OzoneManager.class);
     OzoneConfiguration ozoneConfiguration = new OzoneConfiguration();
@@ -121,7 +127,8 @@ public class TestOzoneManagerRatisServer {
     when(ozoneManager.getSnapshotInfo()).thenReturn(omRatisSnapshotInfo);
     when(ozoneManager.getConfiguration()).thenReturn(conf);
     secConfig = new SecurityConfig(conf);
-    certClient = new OMCertificateClient(secConfig);
+    certClient =
+        new OMCertificateClient(secConfig, omStorage, null, null, null);
     omRatisServer = OzoneManagerRatisServer.newOMRatisServer(conf, 
ozoneManager,
       omNodeDetails, Collections.emptyMap(), secConfig, certClient, false);
     omRatisServer.start();
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOmCertificateClientInit.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOmCertificateClientInit.java
index e3038d9da8..be4a891f12 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOmCertificateClientInit.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOmCertificateClientInit.java
@@ -26,6 +26,7 @@ import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
 import org.apache.hadoop.hdds.security.x509.keys.HDDSKeyGenerator;
 import org.apache.hadoop.hdds.security.x509.keys.KeyCodec;
 import org.apache.hadoop.ozone.OzoneSecurityUtil;
+import org.apache.hadoop.ozone.om.OMStorage;
 import org.apache.hadoop.security.ssl.KeyStoreTestUtil;
 import org.apache.ozone.test.GenericTestUtils;
 import org.bouncycastle.cert.X509CertificateHolder;
@@ -52,6 +53,8 @@ import static 
org.apache.hadoop.hdds.security.x509.certificate.client.Certificat
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.params.provider.Arguments.arguments;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * Test class for {@link OMCertificateClient}.
@@ -93,7 +96,12 @@ public class TestOmCertificateClientInit {
     keyPair = keyGenerator.generateKey();
     x509Certificate = getX509Certificate();
     certSerialId = x509Certificate.getSerialNumber().toString();
-    omCertificateClient = new OMCertificateClient(securityConfig, 
certSerialId);
+    OMStorage storage = mock(OMStorage.class);
+    when(storage.getOmCertSerialId()).thenReturn(certSerialId);
+    when(storage.getClusterID()).thenReturn("test");
+    when(storage.getOmId()).thenReturn(UUID.randomUUID().toString());
+    omCertificateClient =
+        new OMCertificateClient(securityConfig, storage, null, null, null);
     omKeyCodec = new KeyCodec(securityConfig, OM_COMPONENT);
 
     Files.createDirectories(securityConfig.getKeyLocation(OM_COMPONENT));
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneDelegationTokenSecretManager.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneDelegationTokenSecretManager.java
index 51e2a82ba3..a6d2b86b01 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneDelegationTokenSecretManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneDelegationTokenSecretManager.java
@@ -28,6 +28,7 @@ import java.security.cert.CertPath;
 import java.security.cert.X509Certificate;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 
 import com.google.common.collect.ImmutableList;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -38,6 +39,7 @@ import org.apache.hadoop.hdds.server.ServerUtils;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.OMStorage;
 import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.S3SecretCache;
@@ -56,6 +58,8 @@ import org.apache.hadoop.util.Time;
 
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_RATIS_ENABLE_KEY;
 import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMTokenProto.Type.S3AUTHINFO;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import org.apache.ratis.protocol.RaftPeerId;
 import org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory;
@@ -140,7 +144,12 @@ public class TestOzoneDelegationTokenSecretManager {
     CertPath certPath = fact.engineGenerateCertPath(
         ImmutableList.of(singleCert));
 
-    return new OMCertificateClient(securityConfig) {
+    OMStorage omStorage = mock(OMStorage.class);
+    when(omStorage.getOmCertSerialId()).thenReturn(null);
+    when(omStorage.getClusterID()).thenReturn("test");
+    when(omStorage.getOmId()).thenReturn(UUID.randomUUID().toString());
+    return new OMCertificateClient(
+        securityConfig, omStorage, null, null, null) {
       @Override
       public CertPath getCertPath() {
         return certPath;
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java
index f571618b98..d2fa2f992d 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java
@@ -29,7 +29,7 @@ import org.apache.hadoop.hdds.recon.ReconConfig;
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.ReconCertificateClient;
+import org.apache.hadoop.ozone.recon.security.ReconCertificateClient;
 import org.apache.hadoop.hdds.utils.HddsServerUtil;
 import org.apache.hadoop.ozone.OzoneSecurityUtil;
 import org.apache.hadoop.ozone.recon.scm.ReconSafeModeManager;
@@ -169,8 +169,7 @@ public class ReconServer extends GenericCli {
       throws IOException {
     LOG.info("Initializing secure Recon.");
     certClient = new ReconCertificateClient(new SecurityConfig(configuration),
-        reconStorage.getReconCertSerialId(), reconStorage.getClusterID(),
-        reconStorage.getReconId(), this::saveNewCertId, null);
+        reconStorage, this::saveNewCertId, null);
 
     CertificateClient.InitResponse response = certClient.init();
     if (response.equals(CertificateClient.InitResponse.REINIT)) {
@@ -178,8 +177,7 @@ public class ReconServer extends GenericCli {
       reconStorage.unsetReconCertSerialId();
       reconStorage.persistCurrentState();
       certClient = new ReconCertificateClient(new 
SecurityConfig(configuration),
-          reconStorage.getReconCertSerialId(), reconStorage.getClusterID(),
-          reconStorage.getReconId(), this::saveNewCertId, 
this::terminateRecon);
+          reconStorage, this::saveNewCertId, this::terminateRecon);
       response = certClient.init();
     }
     LOG.info("Init response: {}", response);
@@ -192,8 +190,6 @@ public class ReconServer extends GenericCli {
           certClient.getCSRBuilder().build());
       reconStorage.setReconCertSerialId(certId);
       reconStorage.persistCurrentState();
-      // set new certificate ID
-      certClient.setCertificateId(certId);
       LOG.info("Successfully stored SCM signed certificate, case:{}.",
           response);
       break;
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java
index 7ed0c3efd2..7adc78657e 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java
@@ -25,20 +25,15 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.HttpURLConnection;
-import java.net.InetAddress;
 import java.net.URL;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.security.KeyPair;
 import java.sql.Timestamp;
 
 import com.google.inject.Singleton;
 import org.apache.hadoop.hdds.HddsConfigKeys;
 import org.apache.hadoop.hdds.HddsUtils;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
-import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
 import org.apache.hadoop.hdfs.web.URLConnectionFactory;
 import org.apache.hadoop.io.IOUtils;
 
@@ -52,9 +47,7 @@ import static org.jooq.impl.DSL.currentTimestamp;
 import static org.jooq.impl.DSL.select;
 import static org.jooq.impl.DSL.using;
 
-import org.apache.hadoop.security.UserGroupInformation;
 import 
org.apache.hadoop.security.authentication.client.AuthenticationException;
-import org.bouncycastle.pkcs.PKCS10CertificationRequest;
 import org.hadoop.ozone.recon.schema.tables.daos.GlobalStatsDao;
 import org.hadoop.ozone.recon.schema.tables.pojos.GlobalStats;
 import org.jooq.Configuration;
@@ -325,26 +318,4 @@ public class ReconUtils {
     }
     return index;
   }
-
-  /**
-   * Creates CertificateSignRequest.
-   * @param config
-   * */
-  public static PKCS10CertificationRequest getCSR(OzoneConfiguration config,
-      CertificateClient certClient) throws IOException {
-    CertificateSignRequest.Builder builder = certClient.getCSRBuilder();
-    KeyPair keyPair = new KeyPair(certClient.getPublicKey(),
-        certClient.getPrivateKey());
-
-    String hostname = InetAddress.getLocalHost().getCanonicalHostName();
-    String subject = UserGroupInformation.getCurrentUser()
-        .getShortUserName() + "@" + hostname;
-
-    builder.setCA(false)
-        .setKey(keyPair)
-        .setConfiguration(config)
-        .setSubject(subject);
-
-    return builder.build();
-  }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/ReconCertificateClient.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/security/ReconCertificateClient.java
similarity index 84%
rename from 
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/ReconCertificateClient.java
rename to 
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/security/ReconCertificateClient.java
index d949b75c38..5850c44bae 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/ReconCertificateClient.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/security/ReconCertificateClient.java
@@ -15,15 +15,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hdds.security.x509.certificate.client;
+package org.apache.hadoop.ozone.recon.security;
 
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
+import 
org.apache.hadoop.hdds.security.x509.certificate.client.CommonCertificateClient;
 import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
 import 
org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
+import org.apache.hadoop.ozone.recon.scm.ReconStorageConfig;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.bouncycastle.pkcs.PKCS10CertificationRequest;
 import org.slf4j.Logger;
@@ -50,31 +52,20 @@ public class ReconCertificateClient  extends 
CommonCertificateClient {
   private final String clusterID;
   private final String reconID;
 
-  public ReconCertificateClient(SecurityConfig securityConfig,
-      String certSerialId, String clusterId, String reconId,
-      Consumer<String> saveCertIdCallback, Runnable shutdownCallback) {
-    super(securityConfig, LOG, certSerialId, COMPONENT_NAME,
-        saveCertIdCallback, shutdownCallback);
-    this.clusterID = clusterId;
-    this.reconID = reconId;
-  }
-
-  public ReconCertificateClient(SecurityConfig securityConfig,
-      String certSerialId, String clusterId, String reconId) {
-    super(securityConfig, LOG, certSerialId, COMPONENT_NAME, null, null);
-    this.clusterID = clusterId;
-    this.reconID = reconId;
+  public ReconCertificateClient(
+      SecurityConfig config,
+      ReconStorageConfig storage,
+      Consumer<String> saveCertIdCallback,
+      Runnable shutdownCallback) {
+    super(config, LOG, storage.getReconCertSerialId(),
+        COMPONENT_NAME, saveCertIdCallback, shutdownCallback);
+    this.clusterID = storage.getClusterID();
+    this.reconID = storage.getReconId();
   }
 
   @Override
   public CertificateSignRequest.Builder getCSRBuilder()
       throws CertificateException {
-    return getCSRBuilder(new KeyPair(getPublicKey(), getPrivateKey()));
-  }
-
-  @Override
-  public CertificateSignRequest.Builder getCSRBuilder(KeyPair keyPair)
-      throws CertificateException {
     LOG.info("Creating CSR for Recon.");
     try {
       CertificateSignRequest.Builder builder = super.getCSRBuilder();
@@ -83,7 +74,7 @@ public class ReconCertificateClient  extends 
CommonCertificateClient {
           .getShortUserName() + "@" + hostname;
 
       builder.setCA(false)
-          .setKey(keyPair)
+          .setKey(new KeyPair(getPublicKey(), getPrivateKey()))
           .setConfiguration(getConfig())
           .setSubject(subject);
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/security/package-info.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/security/package-info.java
new file mode 100644
index 0000000000..7d17cb84cb
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/security/package-info.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+/**
+ * Home of Recon's security related facilities.
+ */
+package org.apache.hadoop.ozone.recon.security;
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
index b726c8a516..1f2a5c4008 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
@@ -49,7 +49,7 @@ import org.apache.hadoop.hdds.scm.ha.SCMSnapshotDownloader;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
-import 
org.apache.hadoop.hdds.security.x509.certificate.client.ReconCertificateClient;
+import org.apache.hadoop.ozone.recon.security.ReconCertificateClient;
 import org.apache.hadoop.hdds.server.http.HttpConfig;
 import org.apache.hadoop.hdds.utils.db.DBCheckpoint;
 import org.apache.hadoop.hdds.utils.db.RocksDBCheckpoint;
@@ -201,8 +201,7 @@ public class StorageContainerServiceProviderImpl
             try (SCMSnapshotDownloader downloadClient = new InterSCMGrpcClient(
                 hostAddress, grpcPort, configuration,
                 new ReconCertificateClient(new SecurityConfig(configuration),
-                    reconStorage.getReconCertSerialId(),
-                    reconStorage.getClusterID(), reconStorage.getReconId()))) {
+                    reconStorage, null, null))) {
               downloadClient.download(targetFile.toPath()).get();
             } catch (ExecutionException | InterruptedException e) {
               LOG.error("Rocks DB checkpoint downloading failed", e);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to