Java &引用;PKIX路径生成失败”;尽管有有效的Verisign证书

Java &引用;PKIX路径生成失败”;尽管有有效的Verisign证书,java,ssl,openssl,Java,Ssl,Openssl,我遇到了类似的问题,如下所述: “PKIX路径生成失败”异常,尽管具有有效的Verisign证书 我不明白的是,当我在web浏览器中点击相同的URL时,为什么服务器工作正常 服务器正在发送整个证书链,我可以在我的web浏览器中看到它: (Verisign root) -> (VeriSign Class 3 Secure Server CA - G3) -> (my server) 但由于某些原因,Java和OpenSSL命令行工具没有看到它 w

我遇到了类似的问题,如下所述:

“PKIX路径生成失败”异常,尽管具有有效的Verisign证书

我不明白的是,当我在web浏览器中点击相同的URL时,为什么服务器工作正常

服务器正在发送整个证书链,我可以在我的web浏览器中看到它:

   (Verisign root)
     -> (VeriSign Class 3 Secure Server CA - G3) 
       -> (my server) 
但由于某些原因,Java和OpenSSL命令行工具没有看到它

wget
失败,并且
openssl s\u connect
只看到中间的“G3”证书

然而IE和Chrome——没有问题


这里发生了什么?

似乎
G3
不被
Java
openssl
认为是可信的,因为根证书必须驻留在本地(客户端上)才能被信任。如果所讨论的verisign根证书在本地不受信任,那么它是否包含在服务器发送的链中并不重要——客户端不信任它

您在浏览器中看到的不一定是服务器发送的链,而是由浏览器重建的链。Windows可能有G3中间CA作为可信的锚,而其他客户端则没有

要检查服务器发送的实际链,请使用
-showcerts
s\u 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,但使用的是不支持SNI的Java或OpenSSL版本。)

检查这一点的一个好工具是


此外,根据
wget
openssl
的安装方式,它们通常没有默认的可信锚列表,因此您必须明确地为它们提供一个CA证书束的路径。

对,我想知道的是为什么他们不看链中的根。有趣的是,我不知道浏览器显示的是构造的而不是发送的链,就是这样。收到的证书链并没有一直到根目录。Java的
cacerts
具有根CA,但不具有中间CA。我的Windows映像具有中级证书,因此浏览器很高兴。