【问题标题】:"PKIX path building failed" despite valid Verisign certificate尽管 Verisign 证书有效,但“PKIX 路径构建失败”
【发布时间】:2013-04-16 15:54:28
【问题描述】:

我遇到了与此处所述类似的问题:

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 - 没问题。

这是怎么回事?

【问题讨论】:

    标签: java ssl openssl


    【解决方案1】:

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

    要检查服务器发送的实际链,请使用-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 的安装方式,它们通常没有受信任锚点的默认列表,因此您必须明确地为它们提供指向一组 CA 证书的路径。

    【讨论】:

    • 有趣。我不知道浏览器显示的是构造的而不是发送的链
    • 就是这样。收到的证书链并没有一直到根。 Java 的cacerts 具有根CA,但没有 是中间CA。我的 Windows 映像具有中间证书,因此浏览器很满意。
    【解决方案2】:

    似乎G3 不被Javaopenssl 视为信任

    【讨论】:

    • 对,我想知道为什么他们不查看链中的根。
    【解决方案3】:

    这可能是因为根证书必须驻留在本地(在客户端上)才能被信任。如果有问题的威瑞信根证书在本地不受信任,那么它是否包含在服务器发送的链中并不重要 - 它不受客户端信任。

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 2011-05-03
      • 2019-05-03
      • 1970-01-01
      • 2020-03-25
      • 2013-02-03
      • 2018-07-15
      • 2014-01-31
      相关资源
      最近更新 更多