You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,确认存在:
    crypto.policy=unlimited
    
    若缺失,添加该行后重启Payara。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:17:04