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

Java应用配置使用Windows证书存储实现HTTPS时遭遇SSLHandshakeException及InvalidAlgorithmParameterException异常的求助

Java应用配置使用Windows证书存储实现HTTPS时遭遇SSLHandshakeException及InvalidAlgorithmParameterException异常的求助

我现在遇到个棘手的问题,想请教各位大佬。我有一个运行在Windows 11客户端的Java应用,通过HTTPS连接到Linux RHEL服务器上的Java服务端,使用的JRE是Temurin OpenJDK Runtime Environment (build 1.8.0_452-b09)。

原本的方案是把根证书和中间证书安装到JRE自带的cacerts信任库中,这时候一切运行正常,而且浏览器也能正常访问该HTTPS资源(说明Windows系统证书存储里已经有公司的相关证书了)。证书的全流程操作都是用OpenSSL完成的:按公司标准流程生成证书请求并拿到颁发的证书,创建了带密码保护的密钥库,Java应用内用Jetty配置了HTTPS支持,这部分原本都没问题。

现在我想舍弃JRE自带的信任库,改用Windows系统证书存储,却接连踩坑。


我尝试的配置与对应的错误

我测试了两种JVM参数配置,结果都抛出了SSL相关异常:

  1. 配置参数:-Djavax.net.ssl.trustStore=NUL -Djavax.net.ssl.trustStoreType=Windows-ROOT
    抛出的异常:
    javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    
  2. 配置参数:-Djavax.net.ssl.trustStore=NUL -Djavax.net.ssl.trustStoreType=Windows-MY
    抛出的异常:
    javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    

我开启了-Djavax.net.debug=ssl调试,日志里也明确指向信任库访问异常,核心错误信息就是trustAnchors parameter must be non-empty,看起来Java程序没能正常读取到Windows证书存储里的信任锚。


最终解决办法

折腾了好久,终于找到问题所在了!其实就是一个容易被忽略的配置点:

服务端的密钥库(存储服务器私钥的那个文件)里,不能只放服务器自己的证书,还必须导入对应的根证书和中间证书。

把根证书、中间证书都导入到服务端Jetty使用的密钥库后,客户端再用-Djavax.net.ssl.trustStore=NUL -Djavax.net.ssl.trustStoreType=Windows-ROOT配置JVM参数,就能正常通过Windows系统证书存储完成SSL握手,所有流程都跑通了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:48:09