|
@@ -22,6 +22,8 @@ import org.apache.commons.io.FileUtils;
|
|
|
import org.apache.hadoop.hdds.HddsConfigKeys;
|
|
|
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
|
|
|
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.OMCertificateClient;
|
|
|
import org.apache.hadoop.io.Text;
|
|
|
import org.apache.hadoop.security.AccessControlException;
|
|
|
import org.apache.hadoop.security.ssl.KeyStoreTestUtil;
|
|
@@ -37,7 +39,10 @@ import org.junit.Test;
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.security.KeyPair;
|
|
|
+import java.security.PrivateKey;
|
|
|
+import java.security.PublicKey;
|
|
|
import java.security.Signature;
|
|
|
+import java.security.cert.X509Certificate;
|
|
|
|
|
|
/**
|
|
|
* Test class for {@link OzoneDelegationTokenSecretManager}.
|
|
@@ -46,7 +51,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
|
|
|
private OzoneDelegationTokenSecretManager secretManager;
|
|
|
private SecurityConfig securityConfig;
|
|
|
- private KeyPair keyPair;
|
|
|
+ private CertificateClient certificateClient;
|
|
|
private long expiryTime;
|
|
|
private Text serviceRpcAdd;
|
|
|
private OzoneConfiguration conf;
|
|
@@ -61,12 +66,38 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
conf = new OzoneConfiguration();
|
|
|
conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, BASEDIR);
|
|
|
securityConfig = new SecurityConfig(conf);
|
|
|
- // Create Ozone Master key pair.
|
|
|
- keyPair = KeyStoreTestUtil.generateKeyPair("RSA");
|
|
|
+ certificateClient = setupCertificateClient();
|
|
|
+ certificateClient.init();
|
|
|
expiryTime = Time.monotonicNow() + 60 * 60 * 24;
|
|
|
serviceRpcAdd = new Text("localhost");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Helper function to create certificate client.
|
|
|
+ * */
|
|
|
+ private CertificateClient setupCertificateClient() throws Exception {
|
|
|
+ KeyPair keyPair = KeyStoreTestUtil.generateKeyPair("RSA");
|
|
|
+ X509Certificate cert = KeyStoreTestUtil
|
|
|
+ .generateCertificate("CN=OzoneMaster", keyPair, 30, "SHA256withRSA");
|
|
|
+
|
|
|
+ return new OMCertificateClient(securityConfig, "test") {
|
|
|
+ @Override
|
|
|
+ public X509Certificate getCertificate() {
|
|
|
+ return cert;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PrivateKey getPrivateKey() {
|
|
|
+ return keyPair.getPrivate();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PublicKey getPublicKey() {
|
|
|
+ return keyPair.getPublic();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
@After
|
|
|
public void tearDown() throws IOException {
|
|
|
secretManager.stop();
|
|
@@ -77,7 +108,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testCreateToken() throws Exception {
|
|
|
secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
expiryTime, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
TEST_USER,
|
|
|
TEST_USER);
|
|
@@ -95,7 +126,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testRenewTokenSuccess() throws Exception {
|
|
|
secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
expiryTime, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
TEST_USER,
|
|
|
TEST_USER);
|
|
@@ -111,10 +142,9 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testRenewTokenFailure() throws Exception {
|
|
|
secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
expiryTime, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
- TEST_USER,
|
|
|
- TEST_USER);
|
|
|
+ TEST_USER, TEST_USER);
|
|
|
LambdaTestUtils.intercept(AccessControlException.class,
|
|
|
"rougeUser tries to renew a token", () -> {
|
|
|
secretManager.renewToken(token, "rougeUser");
|
|
@@ -128,7 +158,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testRenewTokenFailureMaxTime() throws Exception {
|
|
|
secretManager = createSecretManager(conf, 100,
|
|
|
100, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
TEST_USER,
|
|
|
TEST_USER);
|
|
@@ -146,7 +176,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testRenewTokenFailureRenewalTime() throws Exception {
|
|
|
secretManager = createSecretManager(conf, 1000 * 10,
|
|
|
10, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
TEST_USER,
|
|
|
TEST_USER);
|
|
@@ -160,7 +190,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testCreateIdentifier() throws Exception {
|
|
|
secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
expiryTime, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
OzoneTokenIdentifier identifier = secretManager.createIdentifier();
|
|
|
// Check basic details.
|
|
|
Assert.assertTrue(identifier.getOwner().equals(new Text("")));
|
|
@@ -172,10 +202,9 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testCancelTokenSuccess() throws Exception {
|
|
|
secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
expiryTime, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
- TEST_USER,
|
|
|
- TEST_USER);
|
|
|
+ TEST_USER, TEST_USER);
|
|
|
secretManager.cancelToken(token, TEST_USER.toString());
|
|
|
}
|
|
|
|
|
@@ -183,7 +212,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
public void testCancelTokenFailure() throws Exception {
|
|
|
secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
expiryTime, tokenRemoverScanInterval);
|
|
|
- secretManager.start(keyPair);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
Token<OzoneTokenIdentifier> token = secretManager.createToken(TEST_USER,
|
|
|
TEST_USER,
|
|
|
TEST_USER);
|
|
@@ -193,6 +222,34 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testVerifySignatureSuccess() throws Exception {
|
|
|
+ secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
+ expiryTime, tokenRemoverScanInterval);
|
|
|
+ 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"));
|
|
|
+ Assert.assertTrue(secretManager.verifySignature(id,
|
|
|
+ certificateClient.signData(id.getBytes())));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testVerifySignatureFailure() throws Exception {
|
|
|
+ secretManager = createSecretManager(conf, tokenMaxLifetime,
|
|
|
+ expiryTime, tokenRemoverScanInterval);
|
|
|
+ secretManager.start(certificateClient);
|
|
|
+ OzoneTokenIdentifier id = new OzoneTokenIdentifier();
|
|
|
+ // set invalid om cert serial id
|
|
|
+ id.setOmCertSerialId("1927393");
|
|
|
+ id.setMaxDate(Time.now() + 60*60*24);
|
|
|
+ id.setOwner(new Text("test"));
|
|
|
+ Assert.assertFalse(secretManager.verifySignature(id,
|
|
|
+ certificateClient.signData(id.getBytes())));
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Validate hash using public key of KeyPair.
|
|
|
*/
|
|
@@ -200,7 +257,7 @@ public class TestOzoneDelegationTokenSecretManager {
|
|
|
Signature rsaSignature =
|
|
|
Signature.getInstance(securityConfig.getSignatureAlgo(),
|
|
|
securityConfig.getProvider());
|
|
|
- rsaSignature.initVerify(keyPair.getPublic());
|
|
|
+ rsaSignature.initVerify(certificateClient.getPublicKey());
|
|
|
rsaSignature.update(identifier);
|
|
|
Assert.assertTrue(rsaSignature.verify(hash));
|
|
|
}
|