mysql jdbc 与 SSL 的连接在 tls 握手级别失败
mysql jdbc connection with SSL fails at tls handshake level
我们的 mysql 服务器配置为仅接受使用 ssl 密码 DHE-RSA-AES256-GCM-SHA384 的连接。
我正在使用 java mysql-connector-java (8.0.15) 和 java 8(openjdk 版本“1.8.0_191”
OpenJDK 运行时环境(build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
当我使用下面的程序列出可用的密码时,我得到了
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 密码可用。
下面是列出可用密码的程序
https://confluence.atlassian.com/stashkb/files/679609085/679772359/1/1414093373406/Ciphers.java
但是当我在 ssl 上启用调试模式时,我得到
忽略不支持的密码套件:TLS_DHE_RSA_WITH_AES_256_GCM_SHA384.
并附上以下讯息
即将到来的握手状态:server_hello[2]
*** ClientHello,TLSv1.1
RandomCookie: GMT: 1535642319 字节 = { 168, 0, 213, 212, 68, 19, 189, 131, 12, 147, 76, 108, 65, 77, 56, 170, 35, 147, 119, 196, 102, 161, 241, 133, 49, 97, 153, 200 }
会话 ID:{}
密码套件:[TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA、TLS_RSA_WITH_AES_256_CBC_SHA、TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDH_RSA_WITH_AES_256_CBC_SHA、TLS_DHE_RSA_WITH_AES_256_CBC_SHA、TLS_DHE_DSS_WITH_AES_256_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
压缩方法:{ 0 }
此处,当服务器使用 TLSv1.2 时,客户端开始通过 TLSv1.1 进行通信
我还注意到 ExportControlled.java(包 com.mysql.cj.protocol;)将 SSLContext 创建为(第 563 行)
try{
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kms, tms.toArray(new TrustManager[tms.size()]), null);
return sslContext;
}
请帮助我理解为什么可用密码被忽略以及我应该如何连接到服务器
非常简单,我只需要将 enabledTLSProtocols 参数添加到 jdbc url
例如:-
jdbc:mysql://<hostname>:3115/<schema>?enabledTLSProtocols=TLSv1.2
我得到了这个工作,我必须在连接 属性 和 mysql-connector-java-8.0.26.jar 中设置并启用 TLS 协议版本SSL 模式。 props.setProperty("enabledTLSProtocols", "TLSv1.2")
Properties props = new Properties();
props.setProperty("user", USER_SSL);
props.setProperty("password", PASS_SSL);
props.setProperty("useSSL", "true");
props.setProperty("requireSSL", "true");
props.setProperty("verifyServerCertificate", "true");
props.setProperty("sslMode", "VERIFY_CA");
props.setProperty("javax.net.debug", "all");
props.setProperty("enabledTLSProtocols", "TLSv1.2");
props.setProperty("zeroDateTimeBehavior", "convertToNull");
// Setting the truststore
props.setProperty("trustCertificateKeyStoreUrl", TRUST_STORE_URL);
props.setProperty("trustCertificateKeyStorePassword", TRUST_STORE_PASSWORD);
// Setting the keystore
props.setProperty("clientCertificateKeyStoreUrl", KEYSTORE_URL);
props.setProperty("clientCertificateKeyStorePassword", KEYSTORE_PASSWORD);
try {
conn = DriverManager.getConnection(DB_URL, props);
} catch (Exception ex)
{
Logger.debug(ex);
}
我们的 mysql 服务器配置为仅接受使用 ssl 密码 DHE-RSA-AES256-GCM-SHA384 的连接。
我正在使用 java mysql-connector-java (8.0.15) 和 java 8(openjdk 版本“1.8.0_191” OpenJDK 运行时环境(build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
当我使用下面的程序列出可用的密码时,我得到了 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 密码可用。
下面是列出可用密码的程序 https://confluence.atlassian.com/stashkb/files/679609085/679772359/1/1414093373406/Ciphers.java
但是当我在 ssl 上启用调试模式时,我得到 忽略不支持的密码套件:TLS_DHE_RSA_WITH_AES_256_GCM_SHA384.
并附上以下讯息
即将到来的握手状态:server_hello[2]
*** ClientHello,TLSv1.1 RandomCookie: GMT: 1535642319 字节 = { 168, 0, 213, 212, 68, 19, 189, 131, 12, 147, 76, 108, 65, 77, 56, 170, 35, 147, 119, 196, 102, 161, 241, 133, 49, 97, 153, 200 } 会话 ID:{} 密码套件:[TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA、TLS_RSA_WITH_AES_256_CBC_SHA、TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDH_RSA_WITH_AES_256_CBC_SHA、TLS_DHE_RSA_WITH_AES_256_CBC_SHA、TLS_DHE_DSS_WITH_AES_256_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 压缩方法:{ 0 }
此处,当服务器使用 TLSv1.2 时,客户端开始通过 TLSv1.1 进行通信
我还注意到 ExportControlled.java(包 com.mysql.cj.protocol;)将 SSLContext 创建为(第 563 行)
try{
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kms, tms.toArray(new TrustManager[tms.size()]), null);
return sslContext;
}
请帮助我理解为什么可用密码被忽略以及我应该如何连接到服务器
非常简单,我只需要将 enabledTLSProtocols 参数添加到 jdbc url
例如:-
jdbc:mysql://<hostname>:3115/<schema>?enabledTLSProtocols=TLSv1.2
我得到了这个工作,我必须在连接 属性 和 mysql-connector-java-8.0.26.jar 中设置并启用 TLS 协议版本SSL 模式。 props.setProperty("enabledTLSProtocols", "TLSv1.2")
Properties props = new Properties();
props.setProperty("user", USER_SSL);
props.setProperty("password", PASS_SSL);
props.setProperty("useSSL", "true");
props.setProperty("requireSSL", "true");
props.setProperty("verifyServerCertificate", "true");
props.setProperty("sslMode", "VERIFY_CA");
props.setProperty("javax.net.debug", "all");
props.setProperty("enabledTLSProtocols", "TLSv1.2");
props.setProperty("zeroDateTimeBehavior", "convertToNull");
// Setting the truststore
props.setProperty("trustCertificateKeyStoreUrl", TRUST_STORE_URL);
props.setProperty("trustCertificateKeyStorePassword", TRUST_STORE_PASSWORD);
// Setting the keystore
props.setProperty("clientCertificateKeyStoreUrl", KEYSTORE_URL);
props.setProperty("clientCertificateKeyStorePassword", KEYSTORE_PASSWORD);
try {
conn = DriverManager.getConnection(DB_URL, props);
} catch (Exception ex)
{
Logger.debug(ex);
}