【问题标题】:How do I get the certificate chain given potentially only the leaf certificate?如何获得可能仅给出叶证书的证书链?
【发布时间】:2017-09-26 02:01:49
【问题描述】:

我正在尝试实现一个自定义的X509TrustManager,它会告诉用户有关证书的信息,并使他们能够在出现问题的情况下继续使用服务器。

我已经将几乎所有东西都连接在一起,并开始针对 badssl.com 上的各种证书进行测试。

当我在 Safari 中访问 expired.badssl.com 时,我看到 三个 证书:

* COMODO RSA Certification Authority
    * COMODO RSA Domain Validation Secure Server CA
        * *.badssl.com 

我的应用程序获得了完整的链。

当我访问wrong.host.badssl.com 时,Safari 仍然显示三个证书,但我的应用程序只看到两个:

* DigiCert Global Root CA (Not in the array passed to the method!)
    * DigiCert SHA2 Secure Server CA
        * *.badssl.com

我假设我可以使用“DigiCert SHA2 Secure Server CA”证书中的“颁发者”名称以某种方式找到根证书,但是在哪里我可以找到它?

【问题讨论】:

    标签: java ssl certificate ssl-certificate x509certificate


    【解决方案1】:

    用于验证服务器链(或通常任何接收到的链)的根证书应在本地信任库中找到。这正是默认的TrustManager 所做的——它在本地信任库中查找,或者更确切地说,它实例化了一个CertPathValidator,它(通常)默认为PKIXValidator,它在通常初始化的信任库(包含证书条目的密钥库)中查找从默认为 JRE/lib/security/cacerts 的本地文件中提取,然后执行该验证器,该验证器通过使用主题名称的 HashMap 从所述信任库中查找根来进行验证。

    虽然是简短的声明,但 in RFC 5246 for TLS 1.2(未更改 1.1 的 4346 和 1.0 的 2346)。

    如果您仔细观察,您会发现这些案例实际上并没有您想象的那么不同。

    wrong.host.badssl.com 提供一个证书链,包括:

    • https://crt.sh/?id=205900989leaf *.badssl.com 由 DigiCert SHA2 SecServerCA 颁发
    • https://crt.sh/?id=1262388 DigiCert GlobalRootCA 颁发的中间件
      它使用带有 SHA1 指纹 A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436 的根 https://crt.sh/?id=853428,您可以在大多数常见的信任库中找到它,包括 Java(至少 Oracle/Sun Java,OpenJDK 可能因构建方式而异)。请注意,此证书对 *.badssl.com 有效,对于 wrong.host.badssl.com 无效,因为证书通配符名称匹配仅执行一个(最左侧)DNS 标签而不是更多(这需要两个)。

    expired.badssl.com 提供一个证书链,包括:

    • https://crt.sh/?id=7176112leaf *.badssl.com 发布者 COMODO RSADomainValCA
    • https://crt.sh/?id=3509153 COMODO RSACertAuth 发布的中间人
    • https://crt.sh/?id=1044348 桥由 AddTrust ExternalRoot 于 2000 年(至 2020 年)发布
      发送时使用 AddTrust 根 https://crt.sh/?id=1 和 SHA1 指纹 02FAF3E291435468607857694DF5E45B68851868 。但是,COMODO RSA 现在拥有自己的根 https://crt.sh/?id=1720081,日期为 2010 年(直到 2038 年),带有 SHA1 指纹 AFE5D244A8D1194230FF479FE2F897BBCD7A8CB4 被广泛接受——包括 Oracle Java 从 8u51 开始。 (AddTrust External 可以追溯到更远的地方,至少 6u07 是我可以轻松检查的最旧版本。)我敢打赌,如果你看的话,你会发现 Safari 替换 COMODO RSA 的桥接证书位于顶部收到带有 (COMODO RSA) 根的链;在这种情况下,任何依赖者都可以执行这种快捷方式,而我的(近乎最新的)Firefox、IE 和 Chrome/Windows 都可以。 (后两者共享 Windows 信任库;Firefox 使用 Mozilla 的。)

    (检查表的 PS:我使用 SHA1 指纹,因为它们更容易剪切和粘贴并且仍然足够好 - 已发现某些数据的 SHA1 冲突,但由于签名相关性而更难的完整证书,以及无论如何,只有第二个原像实际上是一个问题,AFAIK 根本没有人在这方面取得任何进展。)


    由于上面引用的 RFC,您的标题中的问题“仅给出叶证书”不应出现在 TLS 中。但如果是这样,这几乎是 OpenSSL generate certificate chain 的副本,并且适用相同的逻辑:关注 CAIssuers,或者(幸运的话)链上 CT 日志——就像我为上述手动所做的那样!

    【讨论】:

    • 即使在这种情况下,我也不确定它是否会与该问题重复,因为该问题是关于如何在 openssl 中执行此操作,而此问题是关于如何在 java 中执行此操作,无法方便地访问 openssl。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多