OpenJDK 8连接数据库TLSv1.2握手失败:无协商密码套件
解决OpenJDK 8 + Payara 4.1连接SQL Server时的“无协商密码套件”错误
问题本质
尽管配置了Encrypt=False,但SQL Server可能强制SSL连接,或JDBC驱动/Payara连接池的配置未生效,导致TLS握手触发,而OpenJDK 1.8.0_372的密码套件与SQL Server支持的无重叠,引发协商失败。
排查与修复步骤
1. 确认SQL Server的加密强制状态
登录SQL Server执行以下查询,判断是否强制加密:
SELECT name, value_in_use FROM sys.configurations WHERE name = 'force encryption'
若value_in_use为1,服务器强制SSL连接,此时Encrypt=False会被忽略,必须配置合法的SSL连接参数。
2. 对齐Java与SQL Server的密码套件
对比你提供的nmap扫描结果和Java运行时密码套件输出,提取双方共有的套件,通过JVM参数指定优先使用这些套件:
- 编辑Payara域配置文件
domain.xml,添加JVM参数:
例如双方均支持<jvm-options>-Dhttps.cipherSuites=套件1,套件2,...</jvm-options>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,则参数为:<jvm-options>-Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384</jvm-options>
3. 修正JDBC URL配置
确保JDBC URL的加密参数覆盖Payara连接池默认设置:
jdbc:sqlserver://<server>:<port>;databaseName=<db>;encrypt=false;trustServerCertificate=true;sslProtocol=TLSv1.2
注:若服务器强制加密,需将encrypt=true,并正确配置证书信任(如使用trustStore参数指定证书存储)。
4. 确认JCE Unlimited Strength配置
OpenJDK 8u372默认已启用无限强度加密,但仍需验证:
- 打开JRE目录下的
lib/security/java.security,确认存在:
若缺失,添加该行后重启Payara。crypto.policy=unlimited
5. 检查Payara的SSL配置
Payara 4.1的网络监听器SSL配置可能限制密码套件:
- 在
domain.xml中找到对应监听器的ssl元素,确保cipher-suite包含SQL Server支持的套件:<ssl classname="com.sun.enterprise.security.ssl.GlassfishSSLImpl" cipher-suite="TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,..." protocol="TLSv1.2"/>
调试验证
添加聚焦的SSL调试参数-Djavax.net.debug=ssl:handshake:verbose到Payara的JVM参数中,重启后查看日志,重点关注:
- 客户端发送的密码套件列表
- 服务器返回的可接受套件
- 握手失败的具体阶段
内容的提问来源于stack exchange,提问作者John Manko
相关产品推荐
相关产品推荐

