Java 8 SSL 握手失败
Java 8 SSL Handshake failure
我们正在为我们的数据库 (12c) 流量使用 SSL。使用 JDBC 客户端 (Java 1.8.0_65, ojdbc7) 连接到数据库时,我们遇到握手失败。我们的数据库服务器正在使用 SSL_RSA_WITH_AES_128_CBC_SHA256
密码。
java.sql.SQLRecoverableException: IO Error: Received fatal alert: handshake_failure
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:752) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566) ~[ojdbc7.jar:12.1.0.2.0]
at java.sql.DriverManager.getConnection(DriverManager.java:664) ~[?:1.8.0_65]
at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_65]
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.8.0_65]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747) ~[?:1.8.0_65]
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) ~[?:1.8.0_65]
at oracle.net.ns.Packet.send(Packet.java:419) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.net.ns.ConnectPacket.send(ConnectPacket.java:241) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:157) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:264) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1452) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496) ~[ojdbc7.jar:12.1.0.2.0]
为了进行分析,我们启用了 ssl 调试并发现了以下内容:
*** ClientHello, TLSv1
RandomCookie: GMT: 1491604703 bytes = { 8, 77, 210, 159, 243, 108, 135, 13, 187, 223, 121, 238, 236, 46, 76, 255, 76, 12, 130, 135, 233, 99, 154, 136, 70, 38, 132, 176 }
Session ID: {223, 118, 94, 151, 92, 90, 47, 206, 76, 197, 24, 27, 241, 230, 236, 184, 87, 216, 9, 178, 99, 207, 38, 169, 193, 168, 99, 17, 211, 45, 239, 31}
Cipher Suites: [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_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods: { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
***
main, WRITE: TLSv1 Handshake, length = 183
main, READ: TLSv1 Handshake, length = 81
我们可以看到是 java 客户端不支持 SSL_RSA_WITH_AES_128_CBC_SHA256
密码。所以我们安装了 JDK8 个 Unlimited Strength Jars。即使在那之后 Java 客户端也不支持 SSL_RSA_WITH_AES_128_CBC_SHA256
密码。
我的查询是:
既然密码是256位算法,我提供了Unlimited Strength Jars,为什么Java客户端还是不支持上面的密码
正如我从 Oracle 文档 here 中看到的那样,它说 JDK 1.8
默认支持上述密码。还有为什么 Java 客户端没有显示它忽略了上述密码。
我没有得到我在这里缺少的东西。非常感谢对此的任何指导。
编辑
按照评论中的建议使用 ojdbc1.8 解决了这个问题。但是,我还有几个问题:
将使用的库更改为 ojdbc8 解决了该问题。
以上错误是由于 Oracle bug 19030178. This 详细解释了步骤。
在 ojdbc7
jar 中,我们应用了 bug 19030178
的补丁并添加了所需的 -D
参数。通过这些更改,它可以正常工作。
漏洞 19030178 的补丁 ojdbc7.jar 位于 OTN。您可以下载这个,也可以使用 12.2 驱动程序。
另外,参考这个post
我们正在为我们的数据库 (12c) 流量使用 SSL。使用 JDBC 客户端 (Java 1.8.0_65, ojdbc7) 连接到数据库时,我们遇到握手失败。我们的数据库服务器正在使用 SSL_RSA_WITH_AES_128_CBC_SHA256
密码。
java.sql.SQLRecoverableException: IO Error: Received fatal alert: handshake_failure
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:752) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566) ~[ojdbc7.jar:12.1.0.2.0]
at java.sql.DriverManager.getConnection(DriverManager.java:664) ~[?:1.8.0_65]
at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_65]
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.8.0_65]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[?:1.8.0_65]
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747) ~[?:1.8.0_65]
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) ~[?:1.8.0_65]
at oracle.net.ns.Packet.send(Packet.java:419) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.net.ns.ConnectPacket.send(ConnectPacket.java:241) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:157) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:264) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1452) ~[ojdbc7.jar:12.1.0.2.0]
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496) ~[ojdbc7.jar:12.1.0.2.0]
为了进行分析,我们启用了 ssl 调试并发现了以下内容:
*** ClientHello, TLSv1
RandomCookie: GMT: 1491604703 bytes = { 8, 77, 210, 159, 243, 108, 135, 13, 187, 223, 121, 238, 236, 46, 76, 255, 76, 12, 130, 135, 233, 99, 154, 136, 70, 38, 132, 176 }
Session ID: {223, 118, 94, 151, 92, 90, 47, 206, 76, 197, 24, 27, 241, 230, 236, 184, 87, 216, 9, 178, 99, 207, 38, 169, 193, 168, 99, 17, 211, 45, 239, 31}
Cipher Suites: [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_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods: { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
***
main, WRITE: TLSv1 Handshake, length = 183
main, READ: TLSv1 Handshake, length = 81
我们可以看到是 java 客户端不支持 SSL_RSA_WITH_AES_128_CBC_SHA256
密码。所以我们安装了 JDK8 个 Unlimited Strength Jars。即使在那之后 Java 客户端也不支持 SSL_RSA_WITH_AES_128_CBC_SHA256
密码。
我的查询是:
既然密码是256位算法,我提供了Unlimited Strength Jars,为什么Java客户端还是不支持上面的密码
正如我从 Oracle 文档 here 中看到的那样,它说
JDK 1.8
默认支持上述密码。还有为什么 Java 客户端没有显示它忽略了上述密码。
我没有得到我在这里缺少的东西。非常感谢对此的任何指导。
编辑
按照评论中的建议使用 ojdbc1.8 解决了这个问题。但是,我还有几个问题:
将使用的库更改为 ojdbc8 解决了该问题。
以上错误是由于 Oracle bug 19030178. This
在 ojdbc7
jar 中,我们应用了 bug 19030178
的补丁并添加了所需的 -D
参数。通过这些更改,它可以正常工作。
漏洞 19030178 的补丁 ojdbc7.jar 位于 OTN。您可以下载这个,也可以使用 12.2 驱动程序。
另外,参考这个post