我遇到了类似问题:
The Webserver I talk to updated its SSL cert and now my app can't talk to it
尽管拥有有效的Verisign证书,“PKIX路径构建失败”例外。
我不明白为什么当我在网络浏览器中点击相同的网址时服务器工作正常。
服务器正在发送整个证书链,我可以在我的网络浏览器中看到它:
(Verisign root)
-> (VeriSign Class 3 Secure Server CA - G3)
-> (my server)
但由于某种原因,Java和OpenSSL命令行工具没有看到它。
wget
失败,openssl s_connect
只看到中间“G3”证书。
然而IE和Chrome - 没问题。
这里发生了什么?
答案 0 :(得分:2)
您在浏览器中看到的不一定是服务器发送的链,而是浏览器重建的链。 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 labs test。
此外,根据wget
或openssl
的安装方式,它们通常没有可信锚的默认列表,因此您必须为它们提供CA捆绑的路径证书明确。
答案 1 :(得分:0)
似乎G3
和Java
openssl
不受信任
答案 2 :(得分:0)
这可能发生,因为根证书必须驻留在本地(在客户端上)才能被信任。如果相关的verisign根证书在本地不受信任,那么它是否包含在服务器发送的链中并不重要 - 它不受客户端信任。