【问题标题】:Certificate path discovery in JavaJava中的证书路径发现
【发布时间】:2013-04-05 04:00:39
【问题描述】:

我尝试通过 java 内置功能建立 https 连接 (HttpURLConnection)。但我得到了这个例外:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
...
...

我的证书链是:

Root certificate -> Intermediate certificate -> Web server certificate

根据“路径发现”的含义,使用的证书是正确的。信任锚是根证书,它是在我系统上的 java 密钥库中导入的。中间证书不是……但是

  1. 中间证书由我信任的根签名 - 所以我也信任中间证书。
  2. Web 服务器证书使用我信任的中间证书签名(第 1 点)

所以验证必须成功通过?我是不是搞错了什么?

我在某处读到这个:

浏览器可以进行自动发现,服务器到服务器不能。

但缺少此功能是非常基本的。有没有明确的方法可以做到这一点auto-discovery

** 更新

是的,这就是问题所在,GPI。我很困惑,因为浏览器可以验证服务器证书,但 java 应用程序不能。 该行为的原因是:

  • 服务器只发送最终证书,而不是整个证书 链;
  • 证书是最近买的,用相对签名的 新的中级证书;
  • 浏览器拥有相对最新的证书列表 包括中间证书;
  • java 有相对的非最新证书列表,并且 中间证书不在里面。
  • 浏览器通过中间证书验证最终证书 证书 java 无法检查证书链,因为:1。 未发送链; 2. 最终证书的签署人( 中间人)不是信任锚。

解决方案可能是:

  • 服务器返回整个证书链
  • 要添加到 java 信任库中的中间证书

【问题讨论】:

    标签: java security https x509 pki


    【解决方案1】:

    我相信您已经检查过您的链,因此我们可以理所当然地认为 RootCert 签署了 IntermediateCert 并且 IntermediateCert 签署了 ServerCert,具有有效的 X500 名称链接和所有...

    也就是说,您的逻辑是有效的,相信 RootCert 就足够了,但不要忘记,为了构建路径,您的客户必须拥有 all 路径中的证书。

    在您的情况下,如果您只信任根证书,则由服务器来通告证书链的其余部分(中间和最终)。如果没有人“给”HTTP 客户端中间证书,那么客户端将失败,因为从 RootServer 不知道 Intermediate 不是可能。

    您可以通过使用-Djavax.net.debug=all 选项启动客户端来实际查看您的服务器证书链。如果链的长度为 1,那么您的服务器只公布最终证书,客户端无法猜测中间证书存在。

    (也可以使用浏览器检查并要求查看服务器证书,但您应该注意,浏览器会显示到信任锚的整个路径,所以如果您想推断服务器链是什么,您必须从该路径中删除浏览器的锚点)。

    在生产服务中,您应该参考您的证书提供商的网站以了解什么被视为根证书(它可能不是最高级别的证书)。这个有效的根应该是您客户端的信任锚,并且任何服务器都应该至少通告链中的所有其他证书,从路径中的最后一个证书(通用名称是服务器的 DNS 名称的那个)开始。

    【讨论】:

      【解决方案2】:

      为了通过 Https 进行连接,您需要使用 HttpsURLConnection 对象。您不能使用 HttpURLConnection 对象创建连接。

      【讨论】:

      • URL serverUrl = 新 URL( serverAddress );连接 = (HttpURLConnection)serverUrl.openConnection();是的,返回的对象是HttpsURLConnection,但是它继承了HttpURLConnection。
      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多