SSL证书链不完整

java1.7程序连接https报错如下(1.8正常,但不保证访问其它https正常):
错误:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

一. 原因
(1). jdk版本太老,内置的证书库缺少根证书。新出的根证书冉要手工导入到JAVA证书库
(2). 目标服务器的配置的SSL缺少中间链证书,导致 Java 无法构建完整的证书链。

检查证书链是否完整:
openssl s_client -connect 域名:443 -showcerts
根据给出的证书内容用下面的方法测试是本地缺少根证书还是对端缺少中间证书

# 查看是否是*通配符证书
openssl x509 -in 111.pem -text -noout | grep "DNS:"

正确的证书链 应包含:
服务器证书
中间证书(Intermediate CA)
根证书(Root CA)(可选,客户端系统内置,但对老版jdk可能没有,就需要加上

# 查看java内置CA证书
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit | grep jdk | awk '{print $1}'
java1.7以前缺少部分ca, 1.8以后基本都有,但国内的如CFCA根证书没有,需要导入。

检查下载的SSL证书pem文件中,通常有2个 BEGIN CERTIFICATE ,
pem文件里第一个是域名证书,第二个是中间链证书,最后一个中间证书的签发者一定是根证书并内置在JAVA证书库中

如果缺少中间证书,可按以下方法获取
1.下载中间链证书:https://myssl.com

工具箱->证书链下载
输入对应的域名获取证书链,替换原来的pem文件或直接在pem原内容下方补充中间链证书和ca证书

2. 另一个在线工具检查
SSL Labs (Qualys SSL Test)
访问: https://www.ssllabs.com/ssltest/
输入域名,查看 "Certification Paths" 部分:
绿色勾选:表示证书链完整。
红色警告:表示缺少中间证书。

3.  另一个在线检查工具:
https://www.sslshopper.com/ssl-checker.html
一般不会出现这种问题,老的java包如:1.6或1.7 可能出现。如果出现新的中间证书商,1.8也有可能出现,要保证有足够的中间证书。

二 .完整证书链测试:

# 查看独立证书的主体(非合并)
openssl x509 -in ABC.pem -noout -subject

# 直接查看证书文本信息含中文
openssl x509 -in ABC.pem -noout -text -nameopt utf8,oneline,-esc_msb

# 查看主体中有中文
openssl x509 -in ABC.pem -noout -subject -nameopt utf8,-esc_msb

# 查看证书的签发者
openssl x509 -in ABC.pem -noout -issuer

# 正确的逐级验证应该由下至上:
# 1:验证根证书(自签名)
openssl verify -CAfile 4.pem 4.pem

# 2. 验证 3.pem 由 4.pem 签发(4.crt是根证书,3是中间证书)
openssl verify -CAfile 4.pem 3.pem

# 3. 验证 2.pem 由 3.pem 签发(使用3.crt作为CA,3和2都是中间证书)
openssl verify -partial_chain -CAfile 3.pem 2.pem

# 4. 验证 1.pem 由 2.pem签发(使用2.pem作为CA,2都是中间证书,1是域名证书)
openssl verify -partial_chain -CAfile 2.pem 1.pem

# 5, 验证完整链
cat 2.pem 3.pem > chain.pem
openssl verify -CAfile 4.pem -untrusted chain.crt 1.pem
# 应该输出:1.pem: OK

 

posted @ 2025-03-27 10:32  莫让年华付水流  阅读(203)  评论(0)    收藏  举报