我遇到了这里描述的类似问题:
The Webserver I talk to updated its SSL cert and now my app can't talk to it
“PKIX 路径构建失败”异常,尽管具有有效的 Verisign 证书。
我不明白的是为什么当我在网络浏览器中点击相同的 URL 时服务器工作正常。
服务器正在发送整个证书链,我可以在我的网络浏览器中看到它:
(Verisign root)
-> (VeriSign Class 3 Secure Server CA - G3)
-> (my server)
但出于某种原因,Java 和 OpenSSL 命令行工具看不到它。
wget
失败,openssl s_connect
只能看到中间“G3”证书。
但 IE 和 Chrome - 没问题。
这是怎么回事?
最佳答案
您在浏览器中看到的不一定是服务器发送的链,而是浏览器重建的链。有可能 Windows 将 G3 中间 CA 作为可信 anchor ,而其他客户端则没有。
要检查服务器发送的实际链,请使用 -showcerts
和 s_connect
:
openssl s_client -showcerts -connect your.host.name:443
确保链以正确的顺序发送:首先是服务器证书,然后是中间证书(如果需要)。
Certificate chain
0 s:/.../CN=your.host.name
i:/.../CN=VeriSign Class 3 Secure Server CA - G3
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
1 s:/.../CN=VeriSign Class 3 Secure Server CA - G3
i:/.../CN=Verisign root
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
(以防万一,请检查您是否获得了正确的证书,以防万一您使用的是 SNI,但使用的是不支持它的 Java 或 OpenSSL 版本。)
一个很好的检查工具是 Qualys SSL labs test .
此外,根据 wget
或 openssl
的安装方式,它们通常没有默认的可信 anchor 列表,因此您必须给它们一个明确指向一束 CA 证书的路径。
关于java - "PKIX path building failed"尽管 Verisign 证书有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041602/