java - "PKIX path building failed"尽管 Verisign 证书有效

标签 java ssl openssl

我遇到了这里描述的类似问题:

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 ,而其他客户端则没有。

要检查服务器发送的实际链,请使用 -showcertss_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 .

此外,根据 wgetopenssl 的安装方式,它们通常没有默认的可信 anchor 列表,因此您必须给它们一个明确指向一束 CA 证书的路径。

关于java - "PKIX path building failed"尽管 Verisign 证书有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041602/

相关文章:

java - 使用 Spring 的 XML 配置解析器

java - 如何使用 jdbc 从数据库加载对象列表

wcf - 在 IIS 上通过 WCF 服务启用 HTTPS

c - 在 Linux 上使用 Easy Curl 通过 SSL 进行 FTP 上传

ssl - 使用 docker 设置安全的 Jenkins master

openssl - 如何在 openssl AES 中获取表(Te0,Te1,...)的内存地址?

ruby - OpenSSL 添加 CA 进行证书验证

java - 如何在 Fragment 和适配器之间创建接口(interface)?

java - java中的联合typedef

python - 如何从 x509 证书中提取签名