我遇到了类似的问题,如下所述:
与我对话的web服务器更新了SSL证书,现在我的应用程序无法与它对话
"PKIX路径构建失败"异常,尽管拥有有效的Verisign证书。
我不明白的是为什么当我在web浏览器中点击相同的URL时服务器工作正常。
服务器正在发送整个证书链,我可以在web浏览器中看到它:
(Verisign root)
-> (VeriSign Class 3 Secure Server CA - G3)
-> (my server)
但是由于某些原因,Java和OpenSSL命令行工具看不到它。
wget
失败,openssl s_connect
只看到中间的"G3"证书。
然而IE和Chrome -没有问题。
这是怎么回事?
您在浏览器中看到的不一定是服务器发送的链,而是浏览器重建的链。有可能Windows有G3中间CA作为可信任的锚,而其他客户端没有。
查看服务器发送的实际链,使用-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实验室测试。
此外,根据wget
或openssl
的安装方式,它们通常没有默认的受信任锚点列表,因此您必须显式地为它们提供一个到一组CA证书的路径。
似乎G3
不被Java
和openssl
信任
可能发生这种情况,因为根证书必须驻留在本地(在客户机上)才能被信任。如果有问题的verisign根证书在本地不受信任,那么它是否包含在服务器发送的链中并不重要—它不受客户端信任。