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

meszibalu pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 9838c070aa1 HBASE-27342 Use Hadoop Credentials API to retrieve 
passwords of TLS key/trust stores (#4751)
9838c070aa1 is described below

commit 9838c070aa1b878d6089ebab79d138a5fb01cf89
Author: Andor Molnár <[email protected]>
AuthorDate: Thu Sep 1 10:06:15 2022 +0200

    HBASE-27342 Use Hadoop Credentials API to retrieve passwords of TLS 
key/trust stores (#4751)
    
    Signed-off-by: Andrew Purtell <[email protected]>
    Signed-off-by: Duo Zhang <[email protected]>
    Signed-off-by: Balazs Meszaros <[email protected]>
---
 bin/hbase                                          |  3 ++
 .../apache/hadoop/hbase/ipc/NettyRpcClient.java    |  3 +-
 .../hadoop/hbase/io/crypto/tls/X509Util.java       | 49 ++++++++++------------
 .../hadoop/hbase/io/crypto/tls/TestX509Util.java   | 44 +++++++------------
 .../hbase/io/crypto/tls/X509TestContext.java       | 26 ++++++------
 .../io/crypto/tls/X509TestContextProvider.java     | 11 ++---
 .../hbase/io/crypto/tls/X509TestHelpers.java       | 34 +++++++--------
 .../apache/hadoop/hbase/ipc/NettyRpcServer.java    |  3 +-
 .../security/AbstractTestTlsRejectPlainText.java   |  4 +-
 .../hadoop/hbase/security/TestNettyTlsIPC.java     |  4 +-
 .../hadoop/hbase/security/TestSaslTlsIPC.java      |  4 +-
 11 files changed, 83 insertions(+), 102 deletions(-)

diff --git a/bin/hbase b/bin/hbase
index fa05a67e783..a654f517731 100755
--- a/bin/hbase
+++ b/bin/hbase
@@ -106,6 +106,7 @@ show_usage() {
   echo "  cellcounter      Run CellCounter tool"
   echo "  pre-upgrade      Run Pre-Upgrade validator tool"
   echo "  hbtop            Run HBTop tool"
+  echo "  credential       Run the Hadoop Credential Shell"
   echo "  CLASSNAME        Run the class named CLASSNAME"
 }
 
@@ -734,6 +735,8 @@ elif [ "$COMMAND" = "hbtop" ] ; then
     HBASE_HBTOP_OPTS="${HBASE_HBTOP_OPTS} 
-Dlog4j2.configurationFile=file:${HBASE_HOME}/conf/log4j2-hbtop.properties"
   fi
   HBASE_OPTS="${HBASE_OPTS} ${HBASE_HBTOP_OPTS}"
+elif [ "$COMMAND" = "credential" ] ; then
+  CLASS='org.apache.hadoop.security.alias.CredentialShell'
 else
   CLASS=$COMMAND
 if [[ "$CLASS" =~ .*IntegrationTest.* ]] ; then
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcClient.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcClient.java
index c45b3a1edcb..ba387d2bf32 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcClient.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcClient.java
@@ -20,7 +20,6 @@ package org.apache.hadoop.hbase.ipc;
 import java.io.IOException;
 import java.net.SocketAddress;
 import java.util.concurrent.atomic.AtomicReference;
-import javax.net.ssl.SSLException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
 import org.apache.hadoop.hbase.HConstants;
@@ -89,7 +88,7 @@ public class NettyRpcClient extends 
AbstractRpcClient<NettyRpcConnection> {
     }
   }
 
-  SslContext getSslContext() throws X509Exception, SSLException {
+  SslContext getSslContext() throws X509Exception, IOException {
     SslContext result = sslContextForClient.get();
     if (result == null) {
       result = X509Util.createSslContextForClient(conf);
diff --git 
a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/crypto/tls/X509Util.java
 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/crypto/tls/X509Util.java
index 78ce833448e..76b7fad4c59 100644
--- 
a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/crypto/tls/X509Util.java
+++ 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/crypto/tls/X509Util.java
@@ -17,7 +17,6 @@
  */
 package org.apache.hadoop.hbase.io.crypto.tls;
 
-import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -32,7 +31,6 @@ import java.util.Objects;
 import javax.net.ssl.CertPathTrustManagerParameters;
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLException;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.TrustManagerFactory;
 import javax.net.ssl.X509ExtendedTrustManager;
@@ -65,6 +63,7 @@ import 
org.apache.hbase.thirdparty.io.netty.handler.ssl.SslContextBuilder;
 public final class X509Util {
 
   private static final Logger LOG = LoggerFactory.getLogger(X509Util.class);
+  private static final char[] EMPTY_CHAR_ARRAY = new char[0];
 
   // Config
   static final String CONFIG_PREFIX = "hbase.rpc.tls.";
@@ -140,12 +139,12 @@ public final class X509Util {
   }
 
   public static SslContext createSslContextForClient(Configuration config)
-    throws X509Exception, SSLException {
+    throws X509Exception, IOException {
 
     SslContextBuilder sslContextBuilder = SslContextBuilder.forClient();
 
     String keyStoreLocation = config.get(TLS_CONFIG_KEYSTORE_LOCATION, "");
-    String keyStorePassword = config.get(TLS_CONFIG_KEYSTORE_PASSWORD, "");
+    char[] keyStorePassword = config.getPassword(TLS_CONFIG_KEYSTORE_PASSWORD);
     String keyStoreType = config.get(TLS_CONFIG_KEYSTORE_TYPE, "");
 
     if (keyStoreLocation.isEmpty()) {
@@ -156,7 +155,7 @@ public final class X509Util {
     }
 
     String trustStoreLocation = config.get(TLS_CONFIG_TRUSTSTORE_LOCATION, "");
-    String trustStorePassword = config.get(TLS_CONFIG_TRUSTSTORE_PASSWORD, "");
+    char[] trustStorePassword = 
config.getPassword(TLS_CONFIG_TRUSTSTORE_PASSWORD);
     String trustStoreType = config.get(TLS_CONFIG_TRUSTSTORE_TYPE, "");
 
     boolean sslCrlEnabled = config.getBoolean(TLS_CONFIG_CLR, false);
@@ -177,9 +176,9 @@ public final class X509Util {
   }
 
   public static SslContext createSslContextForServer(Configuration config)
-    throws X509Exception, SSLException {
+    throws X509Exception, IOException {
     String keyStoreLocation = config.get(TLS_CONFIG_KEYSTORE_LOCATION, "");
-    String keyStorePassword = config.get(TLS_CONFIG_KEYSTORE_PASSWORD, "");
+    char[] keyStorePassword = config.getPassword(TLS_CONFIG_KEYSTORE_PASSWORD);
     String keyStoreType = config.get(TLS_CONFIG_KEYSTORE_TYPE, "");
 
     if (keyStoreLocation.isEmpty()) {
@@ -193,7 +192,7 @@ public final class X509Util {
       .forServer(createKeyManager(keyStoreLocation, keyStorePassword, 
keyStoreType));
 
     String trustStoreLocation = config.get(TLS_CONFIG_TRUSTSTORE_LOCATION, "");
-    String trustStorePassword = config.get(TLS_CONFIG_TRUSTSTORE_PASSWORD, "");
+    char[] trustStorePassword = 
config.getPassword(TLS_CONFIG_TRUSTSTORE_PASSWORD);
     String trustStoreType = config.get(TLS_CONFIG_TRUSTSTORE_TYPE, "");
 
     boolean sslCrlEnabled = config.getBoolean(TLS_CONFIG_CLR, false);
@@ -225,27 +224,25 @@ public final class X509Util {
    * @return the key manager.
    * @throws KeyManagerException if something goes wrong.
    */
-  static X509KeyManager createKeyManager(String keyStoreLocation, String 
keyStorePassword,
+  static X509KeyManager createKeyManager(String keyStoreLocation, char[] 
keyStorePassword,
     String keyStoreType) throws KeyManagerException {
 
-    if (keyStorePassword == null) {
-      keyStorePassword = "";
-    }
-
     if (keyStoreType == null) {
       keyStoreType = "jks";
     }
 
+    if (keyStorePassword == null) {
+      keyStorePassword = EMPTY_CHAR_ARRAY;
+    }
+
     try {
-      char[] password = keyStorePassword.toCharArray();
       KeyStore ks = KeyStore.getInstance(keyStoreType);
-      try (InputStream inputStream =
-        new BufferedInputStream(Files.newInputStream(new 
File(keyStoreLocation).toPath()))) {
-        ks.load(inputStream, password);
+      try (InputStream inputStream = Files.newInputStream(new 
File(keyStoreLocation).toPath())) {
+        ks.load(inputStream, keyStorePassword);
       }
 
       KeyManagerFactory kmf = KeyManagerFactory.getInstance("PKIX");
-      kmf.init(ks, password);
+      kmf.init(ks, keyStorePassword);
 
       for (KeyManager km : kmf.getKeyManagers()) {
         if (km instanceof X509KeyManager) {
@@ -272,23 +269,21 @@ public final class X509Util {
    * @return the trust manager.
    * @throws TrustManagerException if something goes wrong.
    */
-  static X509TrustManager createTrustManager(String trustStoreLocation, String 
trustStorePassword,
+  static X509TrustManager createTrustManager(String trustStoreLocation, char[] 
trustStorePassword,
     String trustStoreType, boolean crlEnabled, boolean ocspEnabled) throws 
TrustManagerException {
 
-    if (trustStorePassword == null) {
-      trustStorePassword = "";
-    }
-
     if (trustStoreType == null) {
       trustStoreType = "jks";
     }
 
+    if (trustStorePassword == null) {
+      trustStorePassword = EMPTY_CHAR_ARRAY;
+    }
+
     try {
-      char[] password = trustStorePassword.toCharArray();
       KeyStore ts = KeyStore.getInstance(trustStoreType);
-      try (InputStream inputStream =
-        new BufferedInputStream(Files.newInputStream(new 
File(trustStoreLocation).toPath()))) {
-        ts.load(inputStream, password);
+      try (InputStream inputStream = Files.newInputStream(new 
File(trustStoreLocation).toPath())) {
+        ts.load(inputStream, trustStorePassword);
       }
 
       PKIXBuilderParameters pbParams = new PKIXBuilderParameters(ts, new 
X509CertSelector());
diff --git 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/TestX509Util.java
 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/TestX509Util.java
index 16df35cf431..09240539c92 100644
--- 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/TestX509Util.java
+++ 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/TestX509Util.java
@@ -19,12 +19,13 @@ package org.apache.hadoop.hbase.io.crypto.tls;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
+import static org.junit.Assume.assumeThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.File;
@@ -42,7 +43,6 @@ import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
 import org.apache.hadoop.hbase.exceptions.KeyManagerException;
 import org.apache.hadoop.hbase.exceptions.SSLContextException;
 import org.apache.hadoop.hbase.exceptions.TrustManagerException;
-import org.apache.hadoop.hbase.exceptions.X509Exception;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -74,6 +74,7 @@ public class TestX509Util {
     HBaseClassTestRule.forClass(TestX509Util.class);
 
   private static final HBaseCommonTestingUtility UTIL = new 
HBaseCommonTestingUtility();
+  private static final char[] EMPTY_CHAR_ARRAY = new char[0];
 
   private static X509TestContextProvider PROVIDER;
 
@@ -84,7 +85,7 @@ public class TestX509Util {
   public X509KeyType certKeyType;
 
   @Parameterized.Parameter(value = 2)
-  public String keyPassword;
+  public char[] keyPassword;
 
   @Parameterized.Parameter(value = 3)
   public Integer paramIndex;
@@ -100,7 +101,7 @@ public class TestX509Util {
     int paramIndex = 0;
     for (X509KeyType caKeyType : X509KeyType.values()) {
       for (X509KeyType certKeyType : X509KeyType.values()) {
-        for (String keyPassword : new String[] { "", "pa$$w0rd" }) {
+        for (char[] keyPassword : new char[][] { "".toCharArray(), 
"pa$$w0rd".toCharArray() }) {
           params.add(new Object[] { caKeyType, certKeyType, keyPassword, 
paramIndex++ });
         }
       }
@@ -172,13 +173,6 @@ public class TestX509Util {
     X509Util.createSslContextForClient(conf);
   }
 
-  @Test(expected = X509Exception.class)
-  public void testCreateSSLContextWithoutKeyStorePassword() throws Exception {
-    assumeTrue(x509TestContext.isKeyStoreEncrypted());
-    conf.unset(X509Util.TLS_CONFIG_KEYSTORE_PASSWORD);
-    X509Util.createSslContextForServer(conf);
-  }
-
   @Test
   public void testCreateSSLContextWithoutTrustStoreLocationClient() throws 
Exception {
     conf.unset(X509Util.TLS_CONFIG_TRUSTSTORE_LOCATION);
@@ -220,7 +214,7 @@ public class TestX509Util {
 
   @Test
   public void testLoadJKSKeyStoreNullPassword() throws Exception {
-    assumeTrue(x509TestContext.getKeyStorePassword().isEmpty());
+    assumeThat(x509TestContext.getKeyStorePassword(), 
equalTo(EMPTY_CHAR_ARRAY));
     // Make sure that empty password and null password are treated the same
     X509Util.createKeyManager(
       x509TestContext.getKeyStoreFile(KeyStoreFileType.JKS).getAbsolutePath(), 
null,
@@ -237,12 +231,12 @@ public class TestX509Util {
   }
 
   @Test
-  public void testLoadJKSKeyStoreWithWrongPassword() throws Exception {
+  public void testLoadJKSKeyStoreWithWrongPassword() {
     assertThrows(KeyManagerException.class, () -> {
       // Attempting to load with the wrong key password should fail
       X509Util.createKeyManager(
-        
x509TestContext.getKeyStoreFile(KeyStoreFileType.JKS).getAbsolutePath(), "wrong 
password",
-        KeyStoreFileType.JKS.getPropertyValue());
+        
x509TestContext.getKeyStoreFile(KeyStoreFileType.JKS).getAbsolutePath(),
+        "wrong password".toCharArray(), 
KeyStoreFileType.JKS.getPropertyValue());
     });
   }
 
@@ -256,9 +250,7 @@ public class TestX509Util {
 
   @Test
   public void testLoadJKSTrustStoreNullPassword() throws Exception {
-    if (!x509TestContext.getTrustStorePassword().isEmpty()) {
-      return;
-    }
+    assumeThat(x509TestContext.getTrustStorePassword(), 
equalTo(EMPTY_CHAR_ARRAY));
     // Make sure that empty password and null password are treated the same
     X509Util.createTrustManager(
       
x509TestContext.getTrustStoreFile(KeyStoreFileType.JKS).getAbsolutePath(), null,
@@ -279,8 +271,8 @@ public class TestX509Util {
     assertThrows(TrustManagerException.class, () -> {
       // Attempting to load with the wrong key password should fail
       X509Util.createTrustManager(
-        
x509TestContext.getTrustStoreFile(KeyStoreFileType.JKS).getAbsolutePath(), 
"wrong password",
-        KeyStoreFileType.JKS.getPropertyValue(), true, true);
+        
x509TestContext.getTrustStoreFile(KeyStoreFileType.JKS).getAbsolutePath(),
+        "wrong password".toCharArray(), 
KeyStoreFileType.JKS.getPropertyValue(), true, true);
     });
   }
 
@@ -294,9 +286,7 @@ public class TestX509Util {
 
   @Test
   public void testLoadPKCS12KeyStoreNullPassword() throws Exception {
-    if (!x509TestContext.getKeyStorePassword().isEmpty()) {
-      return;
-    }
+    assumeThat(x509TestContext.getKeyStorePassword(), 
equalTo(EMPTY_CHAR_ARRAY));
     // Make sure that empty password and null password are treated the same
     X509Util.createKeyManager(
       
x509TestContext.getKeyStoreFile(KeyStoreFileType.PKCS12).getAbsolutePath(), 
null,
@@ -309,7 +299,7 @@ public class TestX509Util {
       // Attempting to load with the wrong key password should fail
       X509Util.createKeyManager(
         
x509TestContext.getKeyStoreFile(KeyStoreFileType.PKCS12).getAbsolutePath(),
-        "wrong password", KeyStoreFileType.PKCS12.getPropertyValue());
+        "wrong password".toCharArray(), 
KeyStoreFileType.PKCS12.getPropertyValue());
     });
   }
 
@@ -324,9 +314,7 @@ public class TestX509Util {
 
   @Test
   public void testLoadPKCS12TrustStoreNullPassword() throws Exception {
-    if (!x509TestContext.getTrustStorePassword().isEmpty()) {
-      return;
-    }
+    assumeThat(x509TestContext.getTrustStorePassword(), 
equalTo(EMPTY_CHAR_ARRAY));
     // Make sure that empty password and null password are treated the same
     X509Util.createTrustManager(
       
x509TestContext.getTrustStoreFile(KeyStoreFileType.PKCS12).getAbsolutePath(), 
null,
@@ -339,7 +327,7 @@ public class TestX509Util {
       // Attempting to load with the wrong key password should fail
       X509Util.createTrustManager(
         
x509TestContext.getTrustStoreFile(KeyStoreFileType.PKCS12).getAbsolutePath(),
-        "wrong password", KeyStoreFileType.PKCS12.getPropertyValue(), true, 
true);
+        "wrong password".toCharArray(), 
KeyStoreFileType.PKCS12.getPropertyValue(), true, true);
     });
   }
 
diff --git 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContext.java
 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContext.java
index 671cc0bbab4..b2085078860 100644
--- 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContext.java
+++ 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContext.java
@@ -56,14 +56,14 @@ public final class X509TestContext {
   private final Configuration conf;
 
   private final X509Certificate trustStoreCertificate;
-  private final String trustStorePassword;
+  private final char[] trustStorePassword;
   private File trustStoreJksFile;
   private File trustStorePemFile;
   private File trustStorePkcs12File;
 
   private final KeyPair keyStoreKeyPair;
   private final X509Certificate keyStoreCertificate;
-  private final String keyStorePassword;
+  private final char[] keyStorePassword;
   private File keyStoreJksFile;
   private File keyStorePemFile;
   private File keyStorePkcs12File;
@@ -80,7 +80,7 @@ public final class X509TestContext {
    * @param keyStorePassword   the password to protect the key store private 
key.
    */
   private X509TestContext(Configuration conf, File tempDir, KeyPair 
trustStoreKeyPair,
-    String trustStorePassword, KeyPair keyStoreKeyPair, String 
keyStorePassword)
+    char[] trustStorePassword, KeyPair keyStoreKeyPair, char[] 
keyStorePassword)
     throws IOException, GeneralSecurityException, OperatorCreationException {
     if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
       throw new IllegalStateException("BC Security provider was not found");
@@ -117,7 +117,7 @@ public final class X509TestContext {
     return tempDir;
   }
 
-  public String getTrustStorePassword() {
+  public char[] getTrustStorePassword() {
     return trustStorePassword;
   }
 
@@ -198,12 +198,12 @@ public final class X509TestContext {
     return keyStoreCertificate;
   }
 
-  public String getKeyStorePassword() {
+  public char[] getKeyStorePassword() {
     return keyStorePassword;
   }
 
   public boolean isKeyStoreEncrypted() {
-    return keyStorePassword.length() > 0;
+    return keyStorePassword != null;
   }
 
   public Configuration getConf() {
@@ -307,11 +307,11 @@ public final class X509TestContext {
     KeyStoreFileType trustStoreFileType) throws IOException {
     conf.set(X509Util.TLS_CONFIG_KEYSTORE_LOCATION,
       this.getKeyStoreFile(keyStoreFileType).getAbsolutePath());
-    conf.set(X509Util.TLS_CONFIG_KEYSTORE_PASSWORD, 
this.getKeyStorePassword());
+    conf.set(X509Util.TLS_CONFIG_KEYSTORE_PASSWORD, 
String.valueOf(this.getKeyStorePassword()));
     conf.set(X509Util.TLS_CONFIG_KEYSTORE_TYPE, 
keyStoreFileType.getPropertyValue());
     conf.set(X509Util.TLS_CONFIG_TRUSTSTORE_LOCATION,
       this.getTrustStoreFile(trustStoreFileType).getAbsolutePath());
-    conf.set(X509Util.TLS_CONFIG_TRUSTSTORE_PASSWORD, 
this.getTrustStorePassword());
+    conf.set(X509Util.TLS_CONFIG_TRUSTSTORE_PASSWORD, 
String.valueOf(this.getTrustStorePassword()));
     conf.set(X509Util.TLS_CONFIG_TRUSTSTORE_TYPE, 
trustStoreFileType.getPropertyValue());
   }
 
@@ -332,9 +332,9 @@ public final class X509TestContext {
     private final Configuration conf;
     private File tempDir;
     private X509KeyType trustStoreKeyType;
-    private String trustStorePassword;
+    private char[] trustStorePassword;
     private X509KeyType keyStoreKeyType;
-    private String keyStorePassword;
+    private char[] keyStorePassword;
 
     /**
      * Creates an empty builder with the given Configuration.
@@ -342,9 +342,7 @@ public final class X509TestContext {
     public Builder(Configuration conf) {
       this.conf = conf;
       trustStoreKeyType = X509KeyType.EC;
-      trustStorePassword = "";
       keyStoreKeyType = X509KeyType.EC;
-      keyStorePassword = "";
     }
 
     /**
@@ -387,7 +385,7 @@ public final class X509TestContext {
      * @param password the password.
      * @return this Builder.
      */
-    public Builder setTrustStorePassword(String password) {
+    public Builder setTrustStorePassword(char[] password) {
       trustStorePassword = password;
       return this;
     }
@@ -409,7 +407,7 @@ public final class X509TestContext {
      * @param password the password.
      * @return this Builder.
      */
-    public Builder setKeyStorePassword(String password) {
+    public Builder setKeyStorePassword(char[] password) {
       keyStorePassword = password;
       return this;
     }
diff --git 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContextProvider.java
 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContextProvider.java
index f5be80f45ba..3024755a2e3 100644
--- 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContextProvider.java
+++ 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestContextProvider.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.hbase.io.crypto.tls;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.Objects;
 import org.apache.hadoop.conf.Configuration;
 
@@ -35,9 +36,9 @@ public class X509TestContextProvider {
 
     private final X509KeyType certKeyType;
 
-    private final String keyPassword;
+    private final char[] keyPassword;
 
-    CacheKey(X509KeyType caKeyType, X509KeyType certKeyType, String 
keyPassword) {
+    CacheKey(X509KeyType caKeyType, X509KeyType certKeyType, char[] 
keyPassword) {
       this.caKeyType = caKeyType;
       this.certKeyType = certKeyType;
       this.keyPassword = keyPassword;
@@ -45,7 +46,7 @@ public class X509TestContextProvider {
 
     @Override
     public int hashCode() {
-      return Objects.hash(caKeyType, certKeyType, keyPassword);
+      return Objects.hash(caKeyType, certKeyType, 
Arrays.hashCode(keyPassword));
     }
 
     @Override
@@ -55,7 +56,7 @@ public class X509TestContextProvider {
       }
       CacheKey other = (CacheKey) obj;
       return caKeyType == other.caKeyType && certKeyType == other.certKeyType
-        && Objects.equals(keyPassword, other.keyPassword);
+        && Arrays.equals(keyPassword, other.keyPassword);
     }
   }
 
@@ -79,7 +80,7 @@ public class X509TestContextProvider {
     this.tempDir = tempDir;
   }
 
-  public X509TestContext get(X509KeyType caKeyType, X509KeyType certKeyType, 
String keyPassword) {
+  public X509TestContext get(X509KeyType caKeyType, X509KeyType certKeyType, 
char[] keyPassword) {
     return ctxs.getUnchecked(new CacheKey(caKeyType, certKeyType, 
keyPassword));
   }
 }
diff --git 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestHelpers.java
 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestHelpers.java
index d4489c1d589..1697dca8669 100644
--- 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestHelpers.java
+++ 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/io/crypto/tls/X509TestHelpers.java
@@ -262,7 +262,7 @@ final class X509TestHelpers {
    * @throws OperatorCreationException if constructing the encryptor from the 
given password fails.
    */
   public static String pemEncodeCertAndPrivateKey(X509Certificate cert, 
PrivateKey privateKey,
-    String keyPassword) throws IOException, OperatorCreationException {
+    char[] keyPassword) throws IOException, OperatorCreationException {
     return pemEncodeX509Certificate(cert) + "\n" + 
pemEncodePrivateKey(privateKey, keyPassword);
   }
 
@@ -276,16 +276,16 @@ final class X509TestHelpers {
    * @throws IOException               if converting the key to PEM format 
fails.
    * @throws OperatorCreationException if constructing the encryptor from the 
given password fails.
    */
-  public static String pemEncodePrivateKey(PrivateKey key, String password)
+  public static String pemEncodePrivateKey(PrivateKey key, char[] password)
     throws IOException, OperatorCreationException {
     StringWriter stringWriter = new StringWriter();
     JcaPEMWriter pemWriter = new JcaPEMWriter(stringWriter);
     OutputEncryptor encryptor = null;
-    if (password != null && password.length() > 0) {
+    if (password != null) {
       encryptor =
         new 
JceOpenSSLPKCS8EncryptorBuilder(PKCSObjectIdentifiers.pbeWithSHAAnd3_KeyTripleDES_CBC)
-          .setProvider(BouncyCastleProvider.PROVIDER_NAME).setRandom(PRNG)
-          .setPasssword(password.toCharArray()).build();
+          
.setProvider(BouncyCastleProvider.PROVIDER_NAME).setRandom(PRNG).setPasssword(password)
+          .build();
     }
     pemWriter.writeObject(new JcaPKCS8Generator(key, encryptor));
     pemWriter.close();
@@ -318,7 +318,7 @@ final class X509TestHelpers {
    *                    will not be encrypted.
    * @return the serialized bytes of the JKS trust store.
    */
-  public static byte[] certToJavaTrustStoreBytes(X509Certificate cert, String 
keyPassword)
+  public static byte[] certToJavaTrustStoreBytes(X509Certificate cert, char[] 
keyPassword)
     throws IOException, GeneralSecurityException {
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
     return certToTrustStoreBytes(cert, keyPassword, trustStore);
@@ -335,19 +335,18 @@ final class X509TestHelpers {
    *                    will not be encrypted.
    * @return the serialized bytes of the PKCS12 trust store.
    */
-  public static byte[] certToPKCS12TrustStoreBytes(X509Certificate cert, 
String keyPassword)
+  public static byte[] certToPKCS12TrustStoreBytes(X509Certificate cert, 
char[] keyPassword)
     throws IOException, GeneralSecurityException {
     KeyStore trustStore = KeyStore.getInstance("PKCS12");
     return certToTrustStoreBytes(cert, keyPassword, trustStore);
   }
 
-  private static byte[] certToTrustStoreBytes(X509Certificate cert, String 
keyPassword,
+  private static byte[] certToTrustStoreBytes(X509Certificate cert, char[] 
keyPassword,
     KeyStore trustStore) throws IOException, GeneralSecurityException {
-    char[] keyPasswordChars = keyPassword == null ? new char[0] : 
keyPassword.toCharArray();
-    trustStore.load(null, keyPasswordChars);
+    trustStore.load(null, keyPassword);
     trustStore.setCertificateEntry(cert.getSubjectDN().toString(), cert);
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-    trustStore.store(outputStream, keyPasswordChars);
+    trustStore.store(outputStream, keyPassword);
     outputStream.flush();
     byte[] result = outputStream.toByteArray();
     outputStream.close();
@@ -366,7 +365,7 @@ final class X509TestHelpers {
    * @return the serialized bytes of the JKS key store.
    */
   public static byte[] certAndPrivateKeyToJavaKeyStoreBytes(X509Certificate 
cert,
-    PrivateKey privateKey, String keyPassword) throws IOException, 
GeneralSecurityException {
+    PrivateKey privateKey, char[] keyPassword) throws IOException, 
GeneralSecurityException {
     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
     return certAndPrivateKeyToBytes(cert, privateKey, keyPassword, keyStore);
   }
@@ -383,18 +382,17 @@ final class X509TestHelpers {
    * @return the serialized bytes of the PKCS12 key store.
    */
   public static byte[] certAndPrivateKeyToPKCS12Bytes(X509Certificate cert, 
PrivateKey privateKey,
-    String keyPassword) throws IOException, GeneralSecurityException {
+    char[] keyPassword) throws IOException, GeneralSecurityException {
     KeyStore keyStore = KeyStore.getInstance("PKCS12");
     return certAndPrivateKeyToBytes(cert, privateKey, keyPassword, keyStore);
   }
 
   private static byte[] certAndPrivateKeyToBytes(X509Certificate cert, 
PrivateKey privateKey,
-    String keyPassword, KeyStore keyStore) throws IOException, 
GeneralSecurityException {
-    char[] keyPasswordChars = keyPassword == null ? new char[0] : 
keyPassword.toCharArray();
-    keyStore.load(null, keyPasswordChars);
-    keyStore.setKeyEntry("key", privateKey, keyPasswordChars, new 
Certificate[] { cert });
+    char[] keyPassword, KeyStore keyStore) throws IOException, 
GeneralSecurityException {
+    keyStore.load(null, keyPassword);
+    keyStore.setKeyEntry("key", privateKey, keyPassword, new Certificate[] { 
cert });
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-    keyStore.store(outputStream, keyPasswordChars);
+    keyStore.store(outputStream, keyPassword);
     outputStream.flush();
     byte[] result = outputStream.toByteArray();
     outputStream.close();
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
index 0a298833865..723132df2aa 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
@@ -25,7 +25,6 @@ import java.io.InterruptedIOException;
 import java.net.InetSocketAddress;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
-import javax.net.ssl.SSLException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
@@ -250,7 +249,7 @@ public class NettyRpcServer extends RpcServer {
   }
 
   private void initSSL(ChannelPipeline p, boolean supportPlaintext)
-    throws X509Exception, SSLException {
+    throws X509Exception, IOException {
     SslContext nettySslContext = X509Util.createSslContextForServer(conf);
 
     if (supportPlaintext) {
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.java
index c6ecccaea34..dc79ab25c49 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.java
@@ -72,7 +72,7 @@ public abstract class AbstractTestTlsRejectPlainText {
   public X509KeyType certKeyType;
 
   @Parameterized.Parameter(2)
-  public String keyPassword;
+  public char[] keyPassword;
 
   private X509TestContext x509TestContext;
 
@@ -85,7 +85,7 @@ public abstract class AbstractTestTlsRejectPlainText {
     List<Object[]> params = new ArrayList<>();
     for (X509KeyType caKeyType : X509KeyType.values()) {
       for (X509KeyType certKeyType : X509KeyType.values()) {
-        for (String keyPassword : new String[] { "", "pa$$w0rd" }) {
+        for (char[] keyPassword : new char[][] { "".toCharArray(), 
"pa$$w0rd".toCharArray() }) {
           params.add(new Object[] { caKeyType, certKeyType, keyPassword });
         }
       }
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestNettyTlsIPC.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestNettyTlsIPC.java
index 758c9d327fa..65460ab3eaf 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestNettyTlsIPC.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestNettyTlsIPC.java
@@ -83,7 +83,7 @@ public class TestNettyTlsIPC extends AbstractTestIPC {
   public X509KeyType certKeyType;
 
   @Parameterized.Parameter(2)
-  public String keyPassword;
+  public char[] keyPassword;
 
   @Parameterized.Parameter(3)
   public boolean acceptPlainText;
@@ -100,7 +100,7 @@ public class TestNettyTlsIPC extends AbstractTestIPC {
     List<Object[]> params = new ArrayList<>();
     for (X509KeyType caKeyType : X509KeyType.values()) {
       for (X509KeyType certKeyType : X509KeyType.values()) {
-        for (String keyPassword : new String[] { "", "pa$$w0rd" }) {
+        for (char[] keyPassword : new char[][] { "".toCharArray(), 
"pa$$w0rd".toCharArray() }) {
           // do not accept plain text
           params.add(new Object[] { caKeyType, certKeyType, keyPassword, 
false, true });
           // support plain text and client enables tls
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestSaslTlsIPC.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestSaslTlsIPC.java
index 3d48af5074c..1477e8aa0fc 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestSaslTlsIPC.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/TestSaslTlsIPC.java
@@ -64,7 +64,7 @@ public class TestSaslTlsIPC extends AbstractTestSecureIPC {
   public X509KeyType certKeyType;
 
   @Parameterized.Parameter(2)
-  public String keyPassword;
+  public char[] keyPassword;
 
   @Parameterized.Parameter(3)
   public boolean acceptPlainText;
@@ -81,7 +81,7 @@ public class TestSaslTlsIPC extends AbstractTestSecureIPC {
     List<Object[]> params = new ArrayList<>();
     for (X509KeyType caKeyType : X509KeyType.values()) {
       for (X509KeyType certKeyType : X509KeyType.values()) {
-        for (String keyPassword : new String[] { "", "pa$$w0rd" }) {
+        for (char[] keyPassword : new char[][] { "".toCharArray(), 
"pa$$w0rd".toCharArray() }) {
           // do not accept plain text
           params.add(new Object[] { caKeyType, certKeyType, keyPassword, 
false, true });
           // support plain text and client enables tls

Reply via email to