This is an automated email from the ASF dual-hosted git repository.
stoty pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix-omid.git
The following commit(s) were added to refs/heads/master by this push:
new a391a29c OMID-317 Add TLSv1.3 to default protocols if supported by JRE
(#197)
a391a29c is described below
commit a391a29cd02244a2bb0e1b1f0a3da766d920af04
Author: Istvan Toth <[email protected]>
AuthorDate: Thu Jul 10 10:35:40 2025 +0200
OMID-317 Add TLSv1.3 to default protocols if supported by JRE (#197)
---
.../main/java/org/apache/omid/tls/X509Util.java | 35 ++++++++++++++++++----
.../java/org/apache/omid/tls/TestX509Util.java | 20 ++++++-------
.../omid/tso/client/OmidClientConfiguration.java | 4 +--
.../apache/omid/tso/client/TestGetSslContext.java | 2 +-
.../tso/client/TestOmidClientConfiguration.java | 5 ++--
.../java/org/apache/omid/tso/TSOServerConfig.java | 4 +--
.../org/apache/omid/tso/TSOServerConfigTest.java | 5 ++--
7 files changed, 50 insertions(+), 25 deletions(-)
diff --git a/common/src/main/java/org/apache/omid/tls/X509Util.java
b/common/src/main/java/org/apache/omid/tls/X509Util.java
index a6d2108c..08cf8f5f 100644
--- a/common/src/main/java/org/apache/omid/tls/X509Util.java
+++ b/common/src/main/java/org/apache/omid/tls/X509Util.java
@@ -33,18 +33,19 @@ import java.io.InputStream;
import java.nio.file.Files;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.cert.PKIXBuilderParameters;
import java.security.cert.X509CertSelector;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
/**
- * Utility code for X509 handling Default cipher suites: Performance testing
done by Facebook
- * engineers shows that on Intel x86_64 machines, Java9 performs better with
GCM and Java8 performs
- * better with CBC, so these seem like reasonable defaults.
+ * Utility code for X509 handling Default cipher suites.
* <p/>
- * This file has is based on the one in HBase project.
+ * This file has is based on the one in HBase project, which is based on the
one in Zookeeper.
* @see <a href=
*
"https://github.com/apache/hbase/blob/d2b0074f7ad4c43d31a1a511a0d74feda72451d1/hbase-common/src/main/java/org/apache/hadoop/hbase/io/crypto/tls/X509Util.java">Base
* revision</a>
@@ -54,15 +55,37 @@ public final class X509Util {
private static final Logger LOG = LoggerFactory.getLogger(X509Util.class);
private static final char[] EMPTY_CHAR_ARRAY = new char[0];
+ public static final String TLS_1_2 = "TLSv1.2";
+ public static final String TLS_1_3 = "TLSv1.3";
+
// Config
public static final int DEFAULT_HANDSHAKE_DETECTION_TIMEOUT_MILLIS = 5000;
- public static final String DEFAULT_PROTOCOL = "TLSv1.2";
+ public static final String DEFAULT_PROTOCOLS = defaultTlsProtocols();
private X509Util() {
// disabled
}
+ // For recent JDKs we could have just used the JVM defaults.
+ // This is only needed for pre JDK-8202343 Java 8 and 11 to avoid a
regression of allowing
+ // pre TLSv1.2 protocols by default.
+ // As Omid only supports the JRE provider, we don't need to worry about
tcnative stuff.
+ private static String defaultTlsProtocols() {
+ String defaultProtocol = TLS_1_2;
+ List<String> supported = new ArrayList<>();
+ try {
+ supported =
Arrays.asList(SSLContext.getDefault().getSupportedSSLParameters().getProtocols());
+ if (supported.contains(TLS_1_3)) {
+ defaultProtocol = TLS_1_3 + "," + TLS_1_2;
+ }
+ } catch (NoSuchAlgorithmException e) {
+ // Ignore.
+ }
+ LOG.info("Default TLS protocols are {}, supported TLS protocols are
{}", defaultProtocol, supported);
+ return defaultProtocol;
+ }
+
public static SslContext createSslContextForClient(String
keyStoreLocation, char[] keyStorePassword,
String keyStoreType,
String trustStoreLocation, char[] trustStorePassword, String trustStoreType,
boolean sslCrlEnabled,
boolean sslOcspEnabled, String enabledProtocols, String cipherSuites, String
tlsConfigProtocols)
@@ -229,7 +252,7 @@ public final class X509Util {
private static String[] getEnabledProtocols(String enabledProtocolsInput,
String tlsConfigProtocols) {
if (enabledProtocolsInput == null) {
- return new String[] {tlsConfigProtocols};
+ return tlsConfigProtocols.split(",");
}
return enabledProtocolsInput.split(",");
}
diff --git a/common/src/test/java/org/apache/omid/tls/TestX509Util.java
b/common/src/test/java/org/apache/omid/tls/TestX509Util.java
index 37ed93ce..31f75bc4 100644
--- a/common/src/test/java/org/apache/omid/tls/TestX509Util.java
+++ b/common/src/test/java/org/apache/omid/tls/TestX509Util.java
@@ -101,9 +101,9 @@ public class TestX509Util extends
BaseX509ParameterizedTestCase {
@Test
public void testCreateSSLContextWithoutCustomProtocol() throws Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
- SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
ByteBufAllocator byteBufAllocatorMock = mock(ByteBufAllocator.class);
- assertEquals(new String[] { X509Util.DEFAULT_PROTOCOL },
+ assertEquals(X509Util.DEFAULT_PROTOCOLS.split(","),
sslContext.newEngine(byteBufAllocatorMock).getEnabledProtocols());
}
@@ -113,7 +113,7 @@ public class TestX509Util extends
BaseX509ParameterizedTestCase {
init(caKeyType, certKeyType, keyPassword, paramIndex);
ByteBufAllocator byteBufAllocatorMock = mock(ByteBufAllocator.class);
- SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, protocol, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, protocol, null, X509Util.DEFAULT_PROTOCOLS);
assertEquals(Collections.singletonList(protocol),
Arrays.asList(sslContext.newEngine(byteBufAllocatorMock).getEnabledProtocols()));
}
@@ -122,14 +122,14 @@ public class TestX509Util extends
BaseX509ParameterizedTestCase {
public void testCreateSSLContextWithoutKeyStoreLocationServer() throws
Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
tlsConfigKeystoreLocation = "";
- SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
}
@Test
public void testCreateSSLContextWithoutKeyStoreLocationClient() throws
Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
tlsConfigKeystoreLocation = "";
- SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
}
@Test(expected = X509Exception.class)
@@ -139,21 +139,21 @@ public class TestX509Util extends
BaseX509ParameterizedTestCase {
throw new X509Exception.SSLContextException("");
}
tlsConfigKeystorePassword = "";
- SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
}
@Test
public void testCreateSSLContextWithoutTrustStoreLocationClient() throws
Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
tlsConfigTrustLocation = "";
- SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForClient(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
}
@Test
public void testCreateSSLContextWithoutTrustStoreLocationServer() throws
Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
tlsConfigTrustLocation = "";
- SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
}
// It would be great to test the value of
PKIXBuilderParameters#setRevocationEnabled,
@@ -161,7 +161,7 @@ public class TestX509Util extends
BaseX509ParameterizedTestCase {
@Test
public void testCRLEnabled() throws Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
- SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, true, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, true, false, null, null, X509Util.DEFAULT_PROTOCOLS);
assertTrue(Boolean.valueOf(System.getProperty("com.sun.net.ssl.checkRevocation")));
assertTrue(Boolean.valueOf(System.getProperty("com.sun.security.enableCRLDP")));
assertFalse(Boolean.valueOf(Security.getProperty("ocsp.enable")));
@@ -170,7 +170,7 @@ public class TestX509Util extends
BaseX509ParameterizedTestCase {
@Test
public void testCRLDisabled() throws Exception {
init(caKeyType, certKeyType, keyPassword, paramIndex);
- SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOL);
+ SslContext sslContext =
X509Util.createSslContextForServer(tlsConfigKeystoreLocation,
tlsConfigKeystorePassword.toCharArray(), tlsConfigKeystoreType,
tlsConfigTrustLocation, tlsConfigTrustPassword.toCharArray(),
tlsConfigTrustType, false, false, null, null, X509Util.DEFAULT_PROTOCOLS);
assertFalse(Boolean.valueOf(System.getProperty("com.sun.net.ssl.checkRevocation")));
assertFalse(Boolean.valueOf(System.getProperty("com.sun.security.enableCRLDP")));
assertFalse(Boolean.valueOf(Security.getProperty("ocsp.enable")));
diff --git
a/transaction-client/src/main/java/org/apache/omid/tso/client/OmidClientConfiguration.java
b/transaction-client/src/main/java/org/apache/omid/tso/client/OmidClientConfiguration.java
index d68a63fe..b2463739 100644
---
a/transaction-client/src/main/java/org/apache/omid/tso/client/OmidClientConfiguration.java
+++
b/transaction-client/src/main/java/org/apache/omid/tso/client/OmidClientConfiguration.java
@@ -23,7 +23,7 @@ import org.apache.omid.YAMLUtils;
import
org.apache.phoenix.thirdparty.com.google.common.annotations.VisibleForTesting;
import static
org.apache.omid.tls.X509Util.DEFAULT_HANDSHAKE_DETECTION_TIMEOUT_MILLIS;
-import static org.apache.omid.tls.X509Util.DEFAULT_PROTOCOL;
+import static org.apache.omid.tls.X509Util.DEFAULT_PROTOCOLS;
/**
* Configuration for Omid client side
@@ -83,7 +83,7 @@ public class OmidClientConfiguration {
private String cipherSuites;
- private String tlsConfigProtocols = DEFAULT_PROTOCOL;
+ private String tlsConfigProtocols = DEFAULT_PROTOCOLS;
//
----------------------------------------------------------------------------------------------------------------
// Instantiation
diff --git
a/transaction-client/src/test/java/org/apache/omid/tso/client/TestGetSslContext.java
b/transaction-client/src/test/java/org/apache/omid/tso/client/TestGetSslContext.java
index 24de8dae..4ce780ca 100644
---
a/transaction-client/src/test/java/org/apache/omid/tso/client/TestGetSslContext.java
+++
b/transaction-client/src/test/java/org/apache/omid/tso/client/TestGetSslContext.java
@@ -68,7 +68,7 @@ public class TestGetSslContext {
SslContext sslContext = tsoClient.getSslContext(tsoClientConf);
ByteBufAllocator byteBufAllocatorMock = mock(ByteBufAllocator.class);
- Assert.assertEquals(new String[] { X509Util.DEFAULT_PROTOCOL },
+ Assert.assertEquals(X509Util.DEFAULT_PROTOCOLS.split(","),
sslContext.newEngine(byteBufAllocatorMock).getEnabledProtocols());
Assert.assertEquals(new String[] { cipherSuite },
diff --git
a/transaction-client/src/test/java/org/apache/omid/tso/client/TestOmidClientConfiguration.java
b/transaction-client/src/test/java/org/apache/omid/tso/client/TestOmidClientConfiguration.java
index 0a3b288c..a0b795a1 100644
---
a/transaction-client/src/test/java/org/apache/omid/tso/client/TestOmidClientConfiguration.java
+++
b/transaction-client/src/test/java/org/apache/omid/tso/client/TestOmidClientConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.omid.tso.client;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.apache.omid.tso.client.OmidClientConfiguration.ConnType;
+import org.apache.omid.tls.X509Util;
import
org.apache.omid.tso.client.OmidClientConfiguration.ConflictDetectionLevel;
public class TestOmidClientConfiguration {
@@ -30,7 +31,7 @@ public class TestOmidClientConfiguration {
Assert.assertEquals(configuration.getConnectionString(),
"localhost:24758");
Assert.assertEquals(configuration.getConnectionType(),
ConnType.DIRECT);
Assert.assertEquals(configuration.getEnabledProtocols(), null);
- Assert.assertEquals(configuration.getTsConfigProtocols(), "TLSv1.2");
+ Assert.assertEquals(configuration.getTsConfigProtocols(),
X509Util.DEFAULT_PROTOCOLS);
Assert.assertEquals(configuration.getTlsEnabled(), false);
Assert.assertEquals(configuration.getKeyStoreLocation(), "");
Assert.assertEquals(configuration.getKeyStorePassword(), "");
@@ -46,7 +47,7 @@ public class TestOmidClientConfiguration {
Assert.assertEquals(configuration.getConnectionString(),
"localhost:24758");
Assert.assertEquals(configuration.getConnectionType(),
ConnType.DIRECT);
Assert.assertEquals(configuration.getEnabledProtocols(), "TLSv1.2");
- Assert.assertEquals(configuration.getTsConfigProtocols(), "TLSv1.2");
+ Assert.assertEquals(configuration.getTsConfigProtocols(),
X509Util.DEFAULT_PROTOCOLS);
Assert.assertEquals(configuration.getTlsEnabled(), true);
Assert.assertEquals(configuration.getKeyStoreLocation(), "/asd");
Assert.assertEquals(configuration.getKeyStorePassword(), "pass");
diff --git a/tso-server/src/main/java/org/apache/omid/tso/TSOServerConfig.java
b/tso-server/src/main/java/org/apache/omid/tso/TSOServerConfig.java
index b1e7a066..d0a02cac 100644
--- a/tso-server/src/main/java/org/apache/omid/tso/TSOServerConfig.java
+++ b/tso-server/src/main/java/org/apache/omid/tso/TSOServerConfig.java
@@ -27,7 +27,7 @@ import org.apache.omid.tools.hbase.SecureHBaseConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.apache.omid.tls.X509Util.DEFAULT_PROTOCOL;
+import static org.apache.omid.tls.X509Util.DEFAULT_PROTOCOLS;
/**
* Reads the configuration parameters of a TSO server instance from
CONFIG_FILE_NAME.
@@ -118,7 +118,7 @@ public class TSOServerConfig extends SecureHBaseConfig {
private String cipherSuites;
- private String tlsConfigProtocols = DEFAULT_PROTOCOL;
+ private String tlsConfigProtocols = DEFAULT_PROTOCOLS;
public boolean getMonitorContext() {
return monitorContext;
diff --git
a/tso-server/src/test/java/org/apache/omid/tso/TSOServerConfigTest.java
b/tso-server/src/test/java/org/apache/omid/tso/TSOServerConfigTest.java
index 4359d9b0..53923b5f 100644
--- a/tso-server/src/test/java/org/apache/omid/tso/TSOServerConfigTest.java
+++ b/tso-server/src/test/java/org/apache/omid/tso/TSOServerConfigTest.java
@@ -17,6 +17,7 @@
*/
package org.apache.omid.tso;
+import org.apache.omid.tls.X509Util;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -28,7 +29,7 @@ public class TSOServerConfigTest {
Assert.assertEquals(tsoServerConfig.getTlsEnabled(), false);
Assert.assertEquals(tsoServerConfig.getSupportPlainText(), true);
Assert.assertEquals(tsoServerConfig.getEnabledProtocols(), null);
- Assert.assertEquals(tsoServerConfig.getTsConfigProtocols(), "TLSv1.2");
+ Assert.assertEquals(tsoServerConfig.getTsConfigProtocols(),
X509Util.DEFAULT_PROTOCOLS);
Assert.assertEquals(tsoServerConfig.getKeyStoreLocation(), "");
Assert.assertEquals(tsoServerConfig.getKeyStorePassword(), "");
Assert.assertEquals(tsoServerConfig.getKeyStoreType(), "");
@@ -45,7 +46,7 @@ public class TSOServerConfigTest {
Assert.assertEquals(tsoServerConfig.getSupportPlainText(), false);
Assert.assertEquals(tsoServerConfig.getEnabledProtocols(), "TLSv1.2");
- Assert.assertEquals(tsoServerConfig.getTsConfigProtocols(), "TLSv1.2");
+ Assert.assertEquals(tsoServerConfig.getTsConfigProtocols(),
X509Util.DEFAULT_PROTOCOLS);
Assert.assertEquals(tsoServerConfig.getKeyStoreLocation(), "/asd");
Assert.assertEquals(tsoServerConfig.getKeyStorePassword(), "pass");