使用Java JDBC连接Oracle 19c时遭遇SSL握手失败求助
解决Java JDBC连接Oracle 19c时的SSL握手失败问题
问题背景
在AIX 6.1环境下使用IBM JRE 1.8编写Java JDBC程序,通过证书连接Oracle 19c数据库时出现SSL握手失败。已确认客户端证书正确且与服务器端匹配,且握手过程中已收到*** Finished消息,但后续仍触发握手失败错误。
错误日志
main, READ: TLSv1.2 Alert, length = 2 main, RECV TLSv1.2 ALERT: fatal, handshake_failure main, fatal: engine already closed. Rethrowing javax.net.ssl.SSLException: Received fatal alert: handshake_failure main, fatal: engine already closed. Rethrowing javax.net.ssl.SSLException: Received fatal alert: handshake_failure main, called closeOutbound() main, closeOutboundInternal() main, SEND TLSv1.2 ALERT: warning, description = close_notify main, WRITE: TLSv1.2 Alert, length = 2 [Raw write]: length = 7
排查与解决步骤
- 确认IBM JRE的TLS协议配置:虽然日志显示使用TLSv1.2,但需显式指定JVM启用该协议,避免默认配置限制。添加JVM参数:
-Djdk.tls.client.protocols=TLSv1.2 - 检查证书链完整性:用IBM JRE自带的
ikeyman工具查看客户端密钥库,确保包含完整的证书链(根CA+中间CA+客户端证书),避免因证书链断裂导致服务器端验证失败。 - 核对Oracle服务器SSL配置:检查数据库端
sqlnet.ora文件,确认SSL_CLIENT_AUTHENTICATION=TRUE(双向认证场景),且SSL_CIPHER_SUITES配置的加密套件与IBM JRE支持的套件匹配。同时开启服务器端SSL日志(SSL_TRACE=TRUE),获取握手失败的具体原因。 - 验证JVM密钥库/信任库参数:确保JDBC连接URL和JVM参数中密钥库、信任库的路径、密码、类型(如JKS/PKCS12)配置正确。示例JDBC URL:
对应JVM参数示例:jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=xxx)(PORT=xxx))(CONNECT_DATA=(SERVICE_NAME=xxx))(SECURITY=(SSL_SERVER_CERT_DN="xxx")))-Djavax.net.ssl.keyStore=/path/to/client.keystore -Djavax.net.ssl.keyStorePassword=xxx -Djavax.net.ssl.trustStore=/path/to/truststore -Djavax.net.ssl.trustStorePassword=xxx - 更新AIX系统加密补丁:AIX 6.1的系统加密库可能存在版本缺陷,安装最新的加密相关补丁,确保IBM JRE能正常调用系统加密资源完成握手。
- 启用JVM SSL详细日志:添加参数
-Djavax.net.debug=ssl:handshake:verbose,获取完整握手流程日志,定位Finished消息后具体的失败环节。
内容的提问来源于stack exchange,提问作者user1929905
相关产品推荐
相关产品推荐

