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

adoroszlai 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 79ca95672a HDDS-8829. Symmetric Keys for Delegation Tokens (#7394)
79ca95672a is described below

commit 79ca95672ac40e886acfc544910f8b551ed88060
Author: Sammi Chen <[email protected]>
AuthorDate: Mon Nov 18 02:10:36 2024 +0800

    HDDS-8829. Symmetric Keys for Delegation Tokens (#7394)
---
 .../hadoop/hdds/security/OzoneSecretManager.java   |   5 +-
 .../hdds/scm/security/SecretKeyManagerService.java |   3 +-
 .../ozone/security/OzoneTokenIdentifier.java       | 100 ++++++++++++---------
 .../apache/hadoop/hdds/scm/TestSecretKeysApi.java  |  20 +----
 .../hadoop/ozone/TestSecureOzoneCluster.java       |  32 ++++---
 .../om/TestOzoneManagerListVolumesSecure.java      |   2 +
 .../src/main/proto/OmClientProtocol.proto          |   3 +-
 .../ozone/om/codec/TokenIdentifierCodec.java       |  10 +--
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |  23 +++--
 .../hadoop/ozone/om/upgrade/OMLayoutFeature.java   |   3 +-
 .../OzoneDelegationTokenSecretManager.java         |  77 ++++++++++++++--
 .../hadoop/ozone/security/SecretKeyTestClient.java |  73 +++++++++++++++
 .../TestOzoneDelegationTokenSecretManager.java     |  43 +++++++--
 13 files changed, 282 insertions(+), 112 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/OzoneSecretManager.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/OzoneSecretManager.java
index 601bdf0ea7..b25941ca67 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/OzoneSecretManager.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/OzoneSecretManager.java
@@ -172,14 +172,13 @@ public abstract class OzoneSecretManager<T extends 
TokenIdentifier>
    */
   private OzoneSecretKey updateCurrentKey(KeyPair keyPair,
       X509Certificate certificate) {
-    logger.info("Updating current master key for generating tokens. Cert id 
{}",
-        certificate.getSerialNumber().toString());
-
     int newCurrentId = incrementCurrentKeyId();
     OzoneSecretKey newKey = new OzoneSecretKey(newCurrentId,
         certificate.getNotAfter().getTime(), keyPair,
         certificate.getSerialNumber().toString());
     currentKey.set(newKey);
+    logger.info("Updated current master key for generating tokens. Cert id {}, 
Master key id {}",
+        certificate.getSerialNumber().toString(), newKey.getKeyId());
     return newKey;
   }
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/SecretKeyManagerService.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/SecretKeyManagerService.java
index 6b77350cc8..50c7401dbb 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/SecretKeyManagerService.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/SecretKeyManagerService.java
@@ -158,7 +158,6 @@ public class SecretKeyManagerService implements SCMService, 
Runnable {
   }
 
   public static boolean isSecretKeyEnable(SecurityConfig conf) {
-    return conf.isSecurityEnabled() &&
-        (conf.isBlockTokenEnabled() || conf.isContainerTokenEnabled());
+    return conf.isSecurityEnabled();
   }
 }
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/OzoneTokenIdentifier.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/OzoneTokenIdentifier.java
index 19f3e7c4a2..d4db268961 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/OzoneTokenIdentifier.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/OzoneTokenIdentifier.java
@@ -23,12 +23,14 @@ import java.io.DataOutput;
 import java.io.IOException;
 import java.time.Instant;
 import java.util.Arrays;
+import java.util.UUID;
 
+import com.google.common.base.Preconditions;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.annotation.InterfaceStability;
 import org.apache.hadoop.io.DataInputBuffer;
-import org.apache.hadoop.io.DataOutputBuffer;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.WritableUtils;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMTokenProto;
@@ -47,7 +49,11 @@ public class OzoneTokenIdentifier extends
     AbstractDelegationTokenIdentifier {
 
   public static final Text KIND_NAME = new Text("OzoneToken");
+  @Deprecated
+  // the certificate id of this OM, deprecated since HDDS-8829
   private String omCertSerialId;
+  // shared secret key id generated by SCM.
+  private String secretKeyId;
   private Type tokenType;
   private String awsAccessId;
   private String signature;
@@ -82,31 +88,6 @@ public class OzoneTokenIdentifier extends
     return KIND_NAME;
   }
 
-  /** Instead of relying on proto serialization, this
-   *  provides  explicit serialization for OzoneTokenIdentifier.
-   * @return byte[]
-   */
-  public byte[] toUniqueSerializedKey() {
-    DataOutputBuffer buf = new DataOutputBuffer();
-    try {
-      super.write(buf);
-      WritableUtils.writeVInt(buf, getTokenType().getNumber());
-      // Set s3 specific fields.
-      if (getTokenType().equals(S3AUTHINFO)) {
-        WritableUtils.writeString(buf, getAwsAccessId());
-        WritableUtils.writeString(buf, getSignature());
-        WritableUtils.writeString(buf, getStrToSign());
-      } else {
-        WritableUtils.writeString(buf, getOmCertSerialId());
-        WritableUtils.writeString(buf, getOmServiceId());
-      }
-    } catch (java.io.IOException e) {
-      throw new IllegalArgumentException(
-          "Can't encode the the raw data ", e);
-    }
-    return buf.getData();
-  }
-
   /** Instead of relying on proto deserialization, this
    *  provides  explicit deserialization for OzoneTokenIdentifier.
    * @return byte[]
@@ -125,20 +106,19 @@ public class OzoneTokenIdentifier extends
       setStrToSign(WritableUtils.readString(in));
     } else {
       this.tokenType = Type.DELEGATION_TOKEN;
-      setOmCertSerialId(WritableUtils.readString(in));
+      String value = WritableUtils.readString(in);
+      try {
+        UUID.fromString(value);
+        setSecretKeyId(value);
+      } catch (IllegalArgumentException e) {
+        setOmCertSerialId(value);
+      }
       setOmServiceId(WritableUtils.readString(in));
     }
     return this;
   }
 
-  /**
-   * Overrides default implementation to write using Protobuf.
-   *
-   * @param out output stream
-   * @throws IOException
-   */
-  @Override
-  public void write(DataOutput out) throws IOException {
+  public OMTokenProto toProtoBuf() throws IOException {
     OMTokenProto.Builder builder = OMTokenProto.newBuilder()
         .setMaxDate(getMaxDate())
         .setType(getTokenType())
@@ -155,14 +135,28 @@ public class OzoneTokenIdentifier extends
           .setSignature(getSignature())
           .setStrToSign(getStrToSign());
     } else {
-      builder.setOmCertSerialId(getOmCertSerialId());
+      if (StringUtils.isNotEmpty(getOmCertSerialId())) {
+        builder.setOmCertSerialId(getOmCertSerialId());
+      }
+      if (StringUtils.isNotEmpty(getSecretKeyId())) {
+        builder.setSecretKeyId(getSecretKeyId());
+      }
       if (getOmServiceId() != null) {
         builder.setOmServiceId(getOmServiceId());
       }
     }
+    return builder.build();
+  }
 
-    OMTokenProto token = builder.build();
-    out.write(token.toByteArray());
+  /**
+   * Overrides default implementation to write using Protobuf.
+   *
+   * @param out output stream
+   * @throws IOException
+   */
+  @Override
+  public void write(DataOutput out) throws IOException {
+    out.write(toProtoBuf().toByteArray());
   }
 
   /**
@@ -183,7 +177,12 @@ public class OzoneTokenIdentifier extends
     setMaxDate(token.getMaxDate());
     setSequenceNumber(token.getSequenceNumber());
     setMasterKeyId(token.getMasterKeyId());
-    setOmCertSerialId(token.getOmCertSerialId());
+    if (token.hasOmCertSerialId()) {
+      setOmCertSerialId(token.getOmCertSerialId());
+    }
+    if (token.hasSecretKeyId()) {
+      setSecretKeyId(token.getSecretKeyId());
+    }
 
     // Set s3 specific fields.
     if (getTokenType().equals(S3AUTHINFO)) {
@@ -221,7 +220,12 @@ public class OzoneTokenIdentifier extends
       identifier.setSequenceNumber(token.getSequenceNumber());
       identifier.setMasterKeyId(token.getMasterKeyId());
     }
-    identifier.setOmCertSerialId(token.getOmCertSerialId());
+    if (token.hasOmCertSerialId()) {
+      identifier.setOmCertSerialId(token.getOmCertSerialId());
+    }
+    if (token.hasSecretKeyId()) {
+      identifier.setSecretKeyId(token.getSecretKeyId());
+    }
     identifier.setOmServiceId(token.getOmServiceId());
     return identifier;
   }
@@ -264,6 +268,7 @@ public class OzoneTokenIdentifier extends
     }
     OzoneTokenIdentifier that = (OzoneTokenIdentifier) obj;
     return new EqualsBuilder()
+        .append(getSecretKeyId(), that.getSecretKeyId())
         .append(getOmCertSerialId(), that.getOmCertSerialId())
         .append(getMaxDate(), that.getMaxDate())
         .append(getIssueDate(), that.getIssueDate())
@@ -326,6 +331,18 @@ public class OzoneTokenIdentifier extends
 
   public void setOmCertSerialId(String omCertSerialId) {
     this.omCertSerialId = omCertSerialId;
+    Preconditions.checkArgument(this.omCertSerialId == null || 
this.secretKeyId == null,
+        "omCertSerialId and secretKeyId cannot both be valid");
+  }
+
+  public String getSecretKeyId() {
+    return secretKeyId;
+  }
+
+  public void setSecretKeyId(String id) {
+    this.secretKeyId = id;
+    Preconditions.checkArgument(this.omCertSerialId == null || 
this.secretKeyId == null,
+        "omCertSerialId and secretKeyId cannot both be valid");
   }
 
   public String getOmServiceId() {
@@ -383,7 +400,8 @@ public class OzoneTokenIdentifier extends
         .append(", signature=").append(getSignature())
         .append(", awsAccessKeyId=").append(getAwsAccessId())
         .append(", omServiceId=").append(getOmServiceId())
-        .append(", omCertSerialId=").append(getOmCertSerialId());
+        .append(", omCertSerialId=").append(getOmCertSerialId())
+        .append(", secretKeyId=").append(getSecretKeyId());
     return buffer.toString();
   }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
index fb92d91ee7..4545818234 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
@@ -23,7 +23,6 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.SecretKeyProtocol;
 import org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
-import org.apache.hadoop.hdds.security.exception.SCMSecretKeyException;
 import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
 import org.apache.hadoop.ipc.RemoteException;
 import org.apache.hadoop.minikdc.MiniKdc;
@@ -67,7 +66,6 @@ import static 
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBER
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY;
 import static 
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY;
 import static 
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY;
-import static 
org.apache.hadoop.hdds.security.exception.SCMSecretKeyException.ErrorCode.SECRET_KEY_NOT_ENABLED;
 import static 
org.apache.hadoop.hdds.utils.HddsServerUtil.getSecretKeyClientForDatanode;
 import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
 import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
@@ -245,24 +243,14 @@ public final class TestSecretKeysApi {
   }
 
   /**
-   * Verify API behavior when block token is not enable.
+   * Verify API behavior.
    */
   @Test
-  public void testSecretKeyApiNotEnabled() throws Exception {
+  public void testSecretKeyApi() throws Exception {
     startCluster(1);
     SecretKeyProtocol secretKeyProtocol = getSecretKeyProtocol();
-
-    SCMSecretKeyException ex = assertThrows(SCMSecretKeyException.class,
-            secretKeyProtocol::getCurrentSecretKey);
-    assertEquals(SECRET_KEY_NOT_ENABLED, ex.getErrorCode());
-
-    ex = assertThrows(SCMSecretKeyException.class,
-        () -> secretKeyProtocol.getSecretKey(UUID.randomUUID()));
-    assertEquals(SECRET_KEY_NOT_ENABLED, ex.getErrorCode());
-
-    ex = assertThrows(SCMSecretKeyException.class,
-        secretKeyProtocol::getAllSecretKeys);
-    assertEquals(SECRET_KEY_NOT_ENABLED, ex.getErrorCode());
+    assertNull(secretKeyProtocol.getSecretKey(UUID.randomUUID()));
+    assertEquals(1, secretKeyProtocol.getAllSecretKeys().size());
   }
 
   /**
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 4f41d51615..637e8bd9e4 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
@@ -64,6 +64,7 @@ import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
 import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
 import org.apache.hadoop.hdds.security.SecurityConfig;
+import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
 import org.apache.hadoop.hdds.security.symmetric.SecretKeyManager;
 import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.DefaultApprover;
@@ -100,6 +101,7 @@ import 
org.apache.hadoop.ozone.om.protocolPB.OmTransportFactory;
 import 
org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolClientSideTranslatorPB;
 import org.apache.hadoop.ozone.security.OMCertificateClient;
 import org.apache.hadoop.ozone.security.OzoneTokenIdentifier;
+import org.apache.hadoop.ozone.security.SecretKeyTestClient;
 import org.apache.hadoop.security.KerberosAuthException;
 import org.apache.hadoop.security.SaslRpcServer.AuthMethod;
 import org.apache.hadoop.security.SecurityUtil;
@@ -152,7 +154,6 @@ import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TOKE
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.USER_MISMATCH;
 import static 
org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod.KERBEROS;
 
-import org.apache.ozone.test.LambdaTestUtils;
 import org.apache.ozone.test.tag.Flaky;
 import org.apache.ozone.test.tag.Unhealthy;
 import org.apache.ratis.protocol.ClientId;
@@ -1182,10 +1183,10 @@ final class TestSecureOzoneCluster {
   }
 
   /**
-   * Tests delegation token renewal after a certificate renew.
+   * Tests delegation token renewal after a secret key rotation.
    */
   @Test
-  void testDelegationTokenRenewCrossCertificateRenew() throws Exception {
+  void testDelegationTokenRenewCrossSecretKeyRotation() throws Exception {
     initSCM();
     try {
       scm = HddsTestUtils.getScmSimple(conf);
@@ -1206,11 +1207,12 @@ final class TestSecureOzoneCluster {
 
       CertificateClientTestImpl certClient =
           new CertificateClientTestImpl(newConf, true);
-      X509Certificate omCert = certClient.getCertificate();
-      String omCertId1 = omCert.getSerialNumber().toString();
       // Start OM
       om.setCertClient(certClient);
       om.setScmTopologyClient(new ScmTopologyClient(scmBlockClient));
+      SecretKeyTestClient secretKeyClient = new SecretKeyTestClient();
+      ManagedSecretKey secretKey1 = secretKeyClient.getCurrentSecretKey();
+      om.setSecretKeyClient(secretKeyClient);
       om.start();
       GenericTestUtils.waitFor(() -> om.isLeaderReady(), 100, 10000);
 
@@ -1231,30 +1233,26 @@ final class TestSecureOzoneCluster {
       assertEquals(SecurityUtil.buildTokenService(
           om.getNodeDetails().getRpcAddress()).toString(),
           token1.getService().toString());
-      assertEquals(omCertId1, token1.decodeIdentifier().getOmCertSerialId());
+      assertEquals(secretKey1.getId().toString(), 
token1.decodeIdentifier().getSecretKeyId());
 
       // Renew delegation token
       long expiryTime = omClient.renewDelegationToken(token1);
       assertThat(expiryTime).isGreaterThan(0);
 
-      // Wait for OM certificate to renew
-      LambdaTestUtils.await(certLifetime, 100, () ->
-          !StringUtils.equals(token1.decodeIdentifier().getOmCertSerialId(),
-              omClient.getDelegationToken(new Text("om"))
-                  .decodeIdentifier().getOmCertSerialId()));
-      String omCertId2 =
-          certClient.getCertificate().getSerialNumber().toString();
-      assertNotEquals(omCertId1, omCertId2);
+      // Rotate secret key
+      secretKeyClient.rotate();
+      ManagedSecretKey secretKey2 = secretKeyClient.getCurrentSecretKey();
+      assertNotEquals(secretKey1.getId(), secretKey2.getId());
       // Get a new delegation token
       Token<OzoneTokenIdentifier> token2 = omClient.getDelegationToken(
           new Text("om"));
-      assertEquals(omCertId2, token2.decodeIdentifier().getOmCertSerialId());
+      assertEquals(secretKey2.getId().toString(), 
token2.decodeIdentifier().getSecretKeyId());
 
-      // Because old certificate is still valid, so renew old token will 
succeed
+      // Because old secret key is still valid, so renew old token will succeed
       expiryTime = omClient.renewDelegationToken(token1);
       assertThat(expiryTime)
           .isGreaterThan(0)
-          .isLessThan(omCert.getNotAfter().getTime());
+          .isLessThan(secretKey2.getExpiryTime().toEpochMilli());
     } finally {
       if (scm != null) {
         scm.stop();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
index 72f1c3374b..6c7cd89109 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
@@ -50,6 +50,7 @@ import org.apache.hadoop.hdds.scm.client.ScmTopologyClient;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.client.SecretKeyTestClient;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.om.protocolPB.OmTransportFactory;
@@ -201,6 +202,7 @@ public class TestOzoneManagerListVolumesSecure {
     om.setScmTopologyClient(new ScmTopologyClient(
         new ScmBlockLocationTestingClient(null, null, 0)));
     om.setCertClient(new CertificateClientTestImpl(conf));
+    om.setSecretKeyClient(new SecretKeyTestClient());
     om.start();
 
     // Get OM client
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index 9971506fa9..92c2b6b4cc 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -1469,7 +1469,8 @@ message OMTokenProto {
     optional string accessKeyId    = 12;
     optional string signature      = 13;
     optional string strToSign      = 14;
-    optional string omServiceId    = 15;
+    optional string omServiceId    = 15 [deprecated = true];
+    optional string secretKeyId    = 16;
 }
 
 message SecretKeyProto {
diff --git 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/codec/TokenIdentifierCodec.java
 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/codec/TokenIdentifierCodec.java
index edf65ae224..84203b1f65 100644
--- 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/codec/TokenIdentifierCodec.java
+++ 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/codec/TokenIdentifierCodec.java
@@ -48,10 +48,10 @@ public final class TokenIdentifierCodec implements 
Codec<OzoneTokenIdentifier> {
   }
 
   @Override
-  public byte[] toPersistedFormat(OzoneTokenIdentifier object) {
+  public byte[] toPersistedFormat(OzoneTokenIdentifier object) throws 
IOException {
     Preconditions
         .checkNotNull(object, "Null object can't be converted to byte array.");
-    return object.toUniqueSerializedKey();
+    return object.toProtoBuf().toByteArray();
   }
 
   @Override
@@ -60,11 +60,11 @@ public final class TokenIdentifierCodec implements 
Codec<OzoneTokenIdentifier> {
     Preconditions.checkNotNull(rawData,
         "Null byte array can't converted to real object.");
     try {
-      OzoneTokenIdentifier object = OzoneTokenIdentifier.newInstance();
-      return object.fromUniqueSerializedKey(rawData);
+      return OzoneTokenIdentifier.readProtoBuf(rawData);
     } catch (IOException ex) {
       try {
-        return OzoneTokenIdentifier.readProtoBuf(rawData);
+        OzoneTokenIdentifier object = OzoneTokenIdentifier.newInstance();
+        return object.fromUniqueSerializedKey(rawData);
       } catch (InvalidProtocolBufferException e) {
         throw new IllegalArgumentException(
             "Can't encode the the raw data from the byte array", e);
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 705f7c9a01..7ee32e840d 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
@@ -87,6 +87,8 @@ import org.apache.hadoop.hdds.scm.client.HddsClientUtils;
 import org.apache.hadoop.hdds.scm.client.ScmTopologyClient;
 import org.apache.hadoop.hdds.scm.ha.SCMHAUtils;
 import org.apache.hadoop.hdds.scm.net.NetworkTopology;
+import org.apache.hadoop.hdds.security.symmetric.DefaultSecretKeyClient;
+import org.apache.hadoop.hdds.security.symmetric.SecretKeyClient;
 import org.apache.hadoop.hdds.server.OzoneAdmins;
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.Table.KeyValue;
@@ -120,8 +122,6 @@ import org.apache.hadoop.hdds.scm.ha.SCMNodeInfo;
 import org.apache.hadoop.hdds.scm.protocol.ScmBlockLocationProtocol;
 import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
 import org.apache.hadoop.hdds.security.SecurityConfig;
-import org.apache.hadoop.hdds.security.symmetric.SecretKeySignerClient;
-import org.apache.hadoop.hdds.security.symmetric.DefaultSecretKeySignerClient;
 import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
 import org.apache.hadoop.hdds.server.ServiceRuntimeInfoImpl;
@@ -371,7 +371,7 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
   private OzoneDelegationTokenSecretManager delegationTokenMgr;
   private OzoneBlockTokenSecretManager blockTokenMgr;
   private CertificateClient certClient;
-  private SecretKeySignerClient secretKeyClient;
+  private SecretKeyClient secretKeyClient;
   private ScmTopologyClient scmTopologyClient;
   private final Text omRpcAddressTxt;
   private OzoneConfiguration configuration;
@@ -671,8 +671,8 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
 
       SecretKeyProtocol secretKeyProtocol =
           HddsServerUtil.getSecretKeyClientForOm(conf);
-      secretKeyClient = new DefaultSecretKeySignerClient(secretKeyProtocol,
-          omNodeDetails.threadNamePrefix());
+      secretKeyClient = DefaultSecretKeyClient.create(
+          conf, secretKeyProtocol, omNodeDetails.threadNamePrefix());
     }
     serviceInfo = new ServiceInfoProvider(secConfig, this, certClient,
         testSecureOmFlag);
@@ -1085,6 +1085,7 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
         .setOzoneManager(this)
         .setS3SecretManager(s3SecretManager)
         .setCertificateClient(certClient)
+        .setSecretKeyClient(secretKeyClient)
         .setOmServiceId(omNodeDetails.getServiceId())
         .build();
   }
@@ -1127,7 +1128,7 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
       throw new UncheckedIOException(e);
     }
 
-    if (secConfig.isBlockTokenEnabled() && blockTokenMgr != null) {
+    if (secConfig.isSecurityEnabled()) {
       LOG.info("Starting secret key client.");
       try {
         secretKeyClient.start(configuration);
@@ -1180,10 +1181,14 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
    * without fully setting up a working secure cluster.
    */
   @VisibleForTesting
-  public void setSecretKeyClient(
-      SecretKeySignerClient secretKeyClient) {
+  public void setSecretKeyClient(SecretKeyClient secretKeyClient) {
     this.secretKeyClient = secretKeyClient;
-    blockTokenMgr.setSecretKeyClient(secretKeyClient);
+    if (blockTokenMgr != null) {
+      blockTokenMgr.setSecretKeyClient(secretKeyClient);
+    }
+    if (delegationTokenMgr != null) {
+      delegationTokenMgr.setSecretKeyClient(secretKeyClient);
+    }
   }
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
index 5a62a7cfc6..e5d9901fda 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
@@ -46,7 +46,8 @@ public enum OMLayoutFeature implements LayoutFeature {
   FILESYSTEM_SNAPSHOT(5, "Ozone version supporting snapshot"),
 
   QUOTA(6, "Ozone quota re-calculate"),
-  HBASE_SUPPORT(7, "Full support of hsync, lease recovery and listOpenFiles 
APIs for HBase");
+  HBASE_SUPPORT(7, "Full support of hsync, lease recovery and listOpenFiles 
APIs for HBase"),
+  DELEGATION_TOKEN_SYMMETRIC_SIGN(8, "Delegation token signed by symmetric 
key");
 
   ///////////////////////////////  /////////////////////////////
   //    Example OM Layout Feature with Actions
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneDelegationTokenSecretManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneDelegationTokenSecretManager.java
index a6fe61eb48..420cb6c6dc 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneDelegationTokenSecretManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneDelegationTokenSecretManager.java
@@ -25,13 +25,19 @@ import java.security.cert.CertificateNotYetValidException;
 import java.security.cert.X509Certificate;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.annotation.InterfaceStability;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.security.OzoneSecretManager;
 import org.apache.hadoop.hdds.security.SecurityConfig;
+import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
+import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
+import org.apache.hadoop.hdds.security.symmetric.SecretKeyClient;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
 import org.apache.hadoop.hdds.security.x509.exception.CertificateException;
 import org.apache.hadoop.io.Text;
@@ -41,6 +47,7 @@ import org.apache.hadoop.ozone.om.S3SecretManager;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.exceptions.OMLeaderNotReadyException;
 import org.apache.hadoop.ozone.om.exceptions.OMNotLeaderException;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature;
 import 
org.apache.hadoop.ozone.security.OzoneSecretStore.OzoneManagerSecretState;
 import org.apache.hadoop.ozone.security.OzoneTokenIdentifier.TokenInfo;
 import org.apache.hadoop.security.AccessControlException;
@@ -64,7 +71,7 @@ import org.slf4j.LoggerFactory;
 public class OzoneDelegationTokenSecretManager
     extends OzoneSecretManager<OzoneTokenIdentifier> {
 
-  private static final Logger LOG = LoggerFactory
+  public static final Logger LOG = LoggerFactory
       .getLogger(OzoneDelegationTokenSecretManager.class);
   private final Map<OzoneTokenIdentifier, TokenInfo> currentTokens;
   private final OzoneSecretStore store;
@@ -73,6 +80,7 @@ public class OzoneDelegationTokenSecretManager
   private final long tokenRemoverScanInterval;
   private final String omServiceId;
   private final OzoneManager ozoneManager;
+  private SecretKeyClient secretKeyClient;
 
   /**
    * If the delegation token update thread holds this lock, it will not get
@@ -100,8 +108,8 @@ public class OzoneDelegationTokenSecretManager
     isRatisEnabled = b.ozoneConf.getBoolean(
         OMConfigKeys.OZONE_OM_RATIS_ENABLE_KEY,
         OMConfigKeys.OZONE_OM_RATIS_ENABLE_DEFAULT);
+    this.secretKeyClient = b.secretKeyClient;
     loadTokenSecretState(store.loadState());
-
   }
 
   /**
@@ -117,6 +125,7 @@ public class OzoneDelegationTokenSecretManager
     private CertificateClient certClient;
     private String omServiceId;
     private OzoneManager ozoneManager;
+    private SecretKeyClient secretKeyClient;
 
     public OzoneDelegationTokenSecretManager build() throws IOException {
       return new OzoneDelegationTokenSecretManager(this);
@@ -157,6 +166,11 @@ public class OzoneDelegationTokenSecretManager
       return this;
     }
 
+    public Builder setSecretKeyClient(SecretKeyClient client) {
+      this.secretKeyClient = client;
+      return this;
+    }
+
     public Builder setOmServiceId(String serviceId) {
       this.omServiceId = serviceId;
       return this;
@@ -195,9 +209,15 @@ public class OzoneDelegationTokenSecretManager
     OzoneTokenIdentifier identifier = createIdentifier(owner, renewer,
         realUser);
     updateIdentifierDetails(identifier);
-
-    byte[] password = createPassword(identifier.getBytes(),
-        getCurrentKey().getPrivateKey());
+    byte[] password;
+    if 
(ozoneManager.getVersionManager().isAllowed(OMLayoutFeature.DELEGATION_TOKEN_SYMMETRIC_SIGN))
 {
+      ManagedSecretKey currentSecretKey = 
secretKeyClient.getCurrentSecretKey();
+      identifier.setSecretKeyId(currentSecretKey.getId().toString());
+      password = currentSecretKey.sign(identifier.getBytes());
+    } else {
+      identifier.setOmCertSerialId(getCertSerialId());
+      password = createPassword(identifier.getBytes(), 
getCurrentKey().getPrivateKey());
+    }
     long expiryTime = identifier.getIssueDate() + getTokenRenewInterval();
 
     // For HA ratis will take care of updating.
@@ -252,7 +272,6 @@ public class OzoneDelegationTokenSecretManager
     identifier.setMasterKeyId(getCurrentKey().getKeyId());
     identifier.setSequenceNumber(sequenceNum);
     identifier.setMaxDate(now + getTokenMaxLifetime());
-    identifier.setOmCertSerialId(getCertSerialId());
     identifier.setOmServiceId(getOmServiceId());
   }
 
@@ -433,9 +452,29 @@ public class OzoneDelegationTokenSecretManager
 
   /**
    * Validates if given hash is valid.
+   * HDDS-8829 changes the delegation token from sign by OM's RSA private key 
to secret key supported by SCM.
+   * The default delegation token lifetime is 7 days.
+   * In the 7 days period after OM is upgraded from version without HDDS-8829 
to version with HDDS-8829, tokens
+   * signed by RSA private key, and tokens signed by secret key will coexist. 
After 7 days, there will be only
+   * tokens signed by secrete key still valid. Following logic will handle 
both types of tokens.
    */
   public boolean verifySignature(OzoneTokenIdentifier identifier,
       byte[] password) {
+    String secretKeyId = identifier.getSecretKeyId();
+    if (StringUtils.isNotEmpty(secretKeyId)) {
+      try {
+        ManagedSecretKey verifyKey = 
secretKeyClient.getSecretKey(UUID.fromString(secretKeyId));
+        return verifyKey.isValidSignature(identifier.getBytes(), password);
+      } catch (SCMSecurityException e) {
+        LOG.error("verifySignature for identifier {} failed", identifier, e);
+        return false;
+      }
+    }
+
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("Verify an asymmetric key signed Token {}", identifier);
+    }
+
     X509Certificate signerCert;
     try {
       signerCert = getCertClient().getCertificate(
@@ -511,6 +550,14 @@ public class OzoneDelegationTokenSecretManager
 
   }
 
+  /**
+   * Load delegation tokens from DB into memory.
+   * HDDS-8829 changes the delegation token from sign by OM's RSA private key 
to secret key supported by SCM.
+   * The default delegation token lifetime is 7 days. After OM is upgraded 
from version without HDDS-8829 to
+   * version with HDDS-8829 and restarts, tokens signed by RSA private key 
will be loaded from DB into memory.
+   * Next OM restarts, if after 7 days, there will be only tokens signed by 
secret key loaded into memory.
+   * Both types of token loading should be supported.
+   */
   private void loadTokenSecretState(
       OzoneManagerSecretState<OzoneTokenIdentifier> state) throws IOException {
     LOG.info("Loading token state into token manager.");
@@ -528,8 +575,17 @@ public class OzoneDelegationTokenSecretManager
           "Can't add persisted delegation token to a running SecretManager.");
     }
 
-    byte[] password = createPassword(identifier.getBytes(),
-        getCertClient().getPrivateKey());
+    byte[] password;
+    if (StringUtils.isNotEmpty(identifier.getSecretKeyId())) {
+      ManagedSecretKey signKey = 
secretKeyClient.getSecretKey(UUID.fromString(identifier.getSecretKeyId()));
+      password = signKey.sign(identifier.getBytes());
+    } else {
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Load an asymmetric key signed Token {}", identifier);
+      }
+      password = createPassword(identifier.getBytes(), 
getCertClient().getPrivateKey());
+    }
+
     if (identifier.getSequenceNumber() > getDelegationTokenSeqNum()) {
       setDelegationTokenSeqNum(identifier.getSequenceNumber());
     }
@@ -588,6 +644,11 @@ public class OzoneDelegationTokenSecretManager
     }
   }
 
+  @VisibleForTesting
+  public void setSecretKeyClient(SecretKeyClient client) {
+    this.secretKeyClient = client;
+  }
+
   /**
    * Remove expired delegation tokens from cache and persisted store.
    */
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/SecretKeyTestClient.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/SecretKeyTestClient.java
new file mode 100644
index 0000000000..32ef5988e1
--- /dev/null
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/SecretKeyTestClient.java
@@ -0,0 +1,73 @@
+/**
+ * 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.ozone.security;
+
+import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
+import org.apache.hadoop.hdds.security.symmetric.SecretKeyClient;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+import java.security.NoSuchAlgorithmException;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Test implementation of {@link SecretKeyClient}.
+ */
+public class SecretKeyTestClient implements SecretKeyClient {
+  private final Map<UUID, ManagedSecretKey> keysMap = new HashMap<>();
+  private ManagedSecretKey current;
+
+  public SecretKeyTestClient() {
+    rotate();
+  }
+
+  public void rotate() {
+    this.current = generateKey();
+    keysMap.put(current.getId(), current);
+  }
+
+  @Override
+  public ManagedSecretKey getCurrentSecretKey() {
+    return current;
+  }
+
+  @Override
+  public ManagedSecretKey getSecretKey(UUID id) {
+    return keysMap.get(id);
+  }
+
+  private ManagedSecretKey generateKey() {
+    KeyGenerator keyGen = null;
+    try {
+      keyGen = KeyGenerator.getInstance("HmacSHA256");
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException("Should never happen", e);
+    }
+    SecretKey secretKey = keyGen.generateKey();
+    return new ManagedSecretKey(
+        UUID.randomUUID(),
+        Instant.now(),
+        Instant.now().plus(Duration.ofHours(1)),
+        secretKey
+    );
+  }
+}
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 d94f59b8fb..c0fdb7a8c2 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
@@ -24,7 +24,6 @@ import java.nio.file.Path;
 import java.security.KeyPair;
 import java.security.PrivateKey;
 import java.security.PublicKey;
-import java.security.Signature;
 import java.security.cert.CertPath;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
@@ -35,6 +34,8 @@ import java.util.UUID;
 import com.google.common.collect.ImmutableList;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.security.SecurityConfig;
+import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
+import org.apache.hadoop.hdds.security.symmetric.SecretKeyClient;
 import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec;
 import org.apache.hadoop.hdds.server.ServerUtils;
 import org.apache.hadoop.io.Text;
@@ -50,6 +51,8 @@ import org.apache.hadoop.ozone.om.S3SecretManagerImpl;
 import org.apache.hadoop.ozone.om.exceptions.OMLeaderNotReadyException;
 import org.apache.hadoop.ozone.om.exceptions.OMNotLeaderException;
 import org.apache.hadoop.ozone.om.helpers.S3SecretValue;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager;
+import org.apache.hadoop.ozone.upgrade.LayoutFeature;
 import org.apache.hadoop.security.AccessControlException;
 import org.apache.hadoop.security.ssl.KeyStoreTestUtil;
 import org.apache.hadoop.security.token.SecretManager;
@@ -64,11 +67,14 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.slf4j.event.Level;
+import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -87,6 +93,7 @@ public class TestOzoneDelegationTokenSecretManager {
   private OzoneDelegationTokenSecretManager secretManager;
   private SecurityConfig securityConfig;
   private OMCertificateClient certificateClient;
+  private SecretKeyClient secretKeyClient;
   private long expiryTime;
   private Text serviceRpcAdd;
   private OzoneConfiguration conf;
@@ -102,6 +109,7 @@ public class TestOzoneDelegationTokenSecretManager {
     securityConfig = new SecurityConfig(conf);
     certificateClient = setupCertificateClient();
     certificateClient.init();
+    secretKeyClient = new SecretKeyTestClient();
     expiryTime = Time.monotonicNow() + 60 * 60 * 24;
     serviceRpcAdd = new Text("localhost");
     final Map<String, S3SecretValue> s3Secrets = new HashMap<>();
@@ -112,6 +120,9 @@ public class TestOzoneDelegationTokenSecretManager {
     om = mock(OzoneManager.class);
     OMMetadataManager metadataManager = new OmMetadataManagerImpl(conf, om);
     when(om.getMetadataManager()).thenReturn(metadataManager);
+    OMLayoutVersionManager versionManager = mock(OMLayoutVersionManager.class);
+    when(versionManager.isAllowed(any(LayoutFeature.class))).thenReturn(true);
+    when(om.getVersionManager()).thenReturn(versionManager);
     s3SecretManager = new S3SecretLockedManager(
         new S3SecretManagerImpl(new S3SecretStoreMap(s3Secrets),
             mock(S3SecretCache.class)),
@@ -368,12 +379,28 @@ public class TestOzoneDelegationTokenSecretManager {
         expiryTime, TOKEN_REMOVER_SCAN_INTERVAL);
     secretManager.start(certificateClient);
     OzoneTokenIdentifier id = new OzoneTokenIdentifier();
+    id.setMaxDate(Time.now() + 60 * 60 * 24);
+    id.setOwner(new Text("test"));
+    
id.setSecretKeyId(secretKeyClient.getCurrentSecretKey().getId().toString());
+    assertTrue(secretManager.verifySignature(id, 
secretKeyClient.getCurrentSecretKey().sign(id.getBytes())));
+  }
+
+  @Test
+  public void testVerifyAsymmetricSignatureSuccess() throws Exception {
+    GenericTestUtils.setLogLevel(OzoneDelegationTokenSecretManager.LOG, 
Level.DEBUG);
+    GenericTestUtils.LogCapturer logCapturer =
+        
GenericTestUtils.LogCapturer.captureLogs(OzoneDelegationTokenSecretManager.LOG);
+    secretManager = createSecretManager(conf, TOKEN_MAX_LIFETIME,
+        expiryTime, TOKEN_REMOVER_SCAN_INTERVAL);
+    secretManager.start(certificateClient);
+    OzoneTokenIdentifier id = new OzoneTokenIdentifier();
     id.setOmCertSerialId(certificateClient.getCertificate()
         .getSerialNumber().toString());
     id.setMaxDate(Time.now() + 60 * 60 * 24);
     id.setOwner(new Text("test"));
-    assertTrue(secretManager.verifySignature(id,
-        certificateClient.signData(id.getBytes())));
+    assertTrue(secretManager.verifySignature(id, 
certificateClient.signData(id.getBytes())));
+    assertTrue(logCapturer.getOutput().contains("Verify an asymmetric key 
signed Token"));
+    logCapturer.stopCapturing();
   }
 
   @Test
@@ -461,12 +488,9 @@ public class TestOzoneDelegationTokenSecretManager {
    * Validate hash using public key of KeyPair.
    */
   private void validateHash(byte[] hash, byte[] identifier) throws Exception {
-    Signature rsaSignature =
-        Signature.getInstance(securityConfig.getSignatureAlgo(),
-            securityConfig.getProvider());
-    rsaSignature.initVerify(certificateClient.getPublicKey());
-    rsaSignature.update(identifier);
-    assertTrue(rsaSignature.verify(hash));
+    OzoneTokenIdentifier ozoneTokenIdentifier = 
OzoneTokenIdentifier.readProtoBuf(identifier);
+    ManagedSecretKey verifyKey = 
secretKeyClient.getSecretKey(UUID.fromString(ozoneTokenIdentifier.getSecretKeyId()));
+    verifyKey.isValidSignature(identifier, hash);
   }
 
   /**
@@ -485,6 +509,7 @@ public class TestOzoneDelegationTokenSecretManager {
         .setS3SecretManager(s3SecretManager)
         .setCertificateClient(certificateClient)
         .setOmServiceId(OzoneConsts.OM_SERVICE_ID_DEFAULT)
+        .setSecretKeyClient(secretKeyClient)
         .build();
   }
 }


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


Reply via email to