求助:Oracle JDBC/SQL*Plus TLS连接OS升级后遇handshake_failure/ORA-28860
我碰到过不少类似的案例,更新系统OpenSSL和内核后导致Oracle数据库TLS握手失败,核心原因通常是加密套件兼容性、协议版本不匹配,或者系统加密策略变化影响了Oracle的加密库。下面给你一步步的排查方向:
1. 确认OpenSSL版本变化与Oracle兼容性
首先搞清楚你更新后的OpenSSL版本,执行:
openssl version
Oracle 12.1在OL6环境下对OpenSSL的版本有一定限制,比如如果更新到了1.0.2系列的部分版本,或者系统默认加密套件被调整,可能会和Oracle自带的加密库(libnnz12.so)产生兼容性问题。你可以对比更新前的版本(如果有记录的话),重点看是否有安全级别或默认套件的变更。
2. 检查数据库端的加密配置参数
登录数据库,查看核心加密相关参数:
show parameter encryption; show parameter ssl_version; show parameter cipher_suites;
- 确保
SSL_VERSION设置为TLSv1.2(和你的JDBC客户端日志里的协议版本一致); - 如果
SSL_CIPHER_SUITES有配置,确认这些套件在更新后的OpenSSL中是否还被支持。可以用openssl ciphers -v命令列出当前系统支持的套件,对比数据库配置的列表。
3. 深挖JDBC的TLS握手日志
你的JDBC日志里应该会有这些关键信息:
- 客户端发送的加密套件列表;
- 服务器返回的套件选择结果(如果为空,就是完全不匹配);
- 协商的协议版本是否一致。
比如如果日志显示客户端提供了TLS_RSA_WITH_AES_256_CBC_SHA,但服务器因为OpenSSL更新后禁用了这个套件,就会导致握手失败。这时候需要在数据库的sqlnet.ora(或者通过ALTER SYSTEM设置参数)添加当前支持的强套件,例如:
SSL_CIPHER_SUITES=(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384)
4. 排查SQL*Plus的ORA-28860错误
ORA-28860本质就是SSL握手失败,和JDBC问题大概率同源,但可以通过客户端跟踪确认:
- 在客户端的
sqlnet.ora中添加:
TRACE_LEVEL_CLIENT=16 TRACE_DIRECTORY_CLIENT=/tmp TRACE_FILE_CLIENT=sqlnet_trace.log
- 尝试用SQL*Plus连接,然后查看
/tmp/sqlnet_trace.log里的握手细节,重点看是否有“no cipher match”之类的提示。
另外,确认客户端的sqlnet.ora中SSL_VERSION和SSL_CIPHER_SUITES是否和服务器端保持一致。
5. 检查系统级加密策略变更
OL6更新后,可能/etc/ssl/openssl.cnf被修改,比如添加了DEFAULT@SECLEVEL=2这类配置,导致旧的弱加密套件被拒绝。你可以临时修改这个配置,降低安全级别测试:
找到[system_default_sect]部分,修改为:
[system_default_sect] MinProtocol = TLSv1.2 CipherString = DEFAULT@SECLEVEL=1
然后重启数据库监听,尝试连接。如果能成功,说明是系统安全级别过高导致的,这时候可以调整数据库的加密套件为符合SECLEVEL=2的强套件,而不是降低系统级别。
6. 验证Oracle加密库的依赖
Oracle的libnnz12.so可能依赖系统的OpenSSL库,执行:
ldd $ORACLE_HOME/lib/libnnz12.so | grep ssl
如果有libssl.so和libcrypto.so的依赖,说明系统OpenSSL的更新直接影响了这个库。这种情况下,建议应用Oracle针对OpenSSL兼容性的最新补丁,或者重新链接Oracle的加密组件。
内容的提问来源于stack exchange,提问作者David Le Borgne

