Tre*_*kaz 0 java ssl certificate ssl-certificate x509certificate
我正在尝试实现一个自定义X509TrustManager,该自定义告诉用户有关证书的信息,并使他们能够在出现问题的情况下继续使用服务器。
我已将几乎所有内容连接在一起,并开始针对badssl.com上的各种证书进行测试。
当我在 Safari 中访问expired.badssl.com时,我看到三个证书:
* COMODO RSA Certification Authority
* COMODO RSA Domain Validation Secure Server CA
* *.badssl.com
Run Code Online (Sandbox Code Playgroud)
我的应用程序获得了完整的链。
但是,当我访问wrong.host.badssl.com时,Safari 仍然显示三个证书,但我的应用程序只看到两个:
* DigiCert Global Root CA (Not in the array passed to the method!)
* DigiCert SHA2 Secure Server CA
* *.badssl.com
Run Code Online (Sandbox Code Playgroud)
我假设我可以使用“DigiCert SHA2 Secure Server CA”证书中的“Issuer”名称以某种方式找到根证书,但我在哪里找到它?
用于验证服务器链(或通常任何收到的链)的根证书应在本地信任库中找到。这正是默认值TrustManager所做的——它在本地信任库中查找,或者更确切地说,它实例化了一个CertPathValidator(通常)默认为PKIXValidator在信任库(包含证书条目的密钥库)中查找的对象,通常从默认为 的本地文件初始化JRE/lib/security/cacerts,然后执行该验证器,该验证器通过使用HashMap按主题名称从所述信任库中查找根来进行验证。
这在 TLS 1.2 的 RFC 5246 中进行了说明,尽管很简短(与 1.1 的 4346 和 1.0 的 2346 保持不变)。
如果你仔细观察,你会发现这些案例实际上并没有你想象的那么不同。
wrong.host.badssl.com提供一个证书链,包括:
* https://crt.sh/?id=205900989 Leaf *.badssl.com 由 DigiCert SHA2 SecServerCA 颁发
* https://crt.sh/?id=1262388由 DigiCert GlobalRootCA 颁发的中间件
,其中使用根https://crt.sh/?id=853428和 SHA1 指纹 A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436,您可以在大多数(如果不是全部)常见信任库中找到它,包括 Java(至少 Oracle/Sun Java,OpenJDK 可能会因构建方式而异)。请注意,此证书对*.badssl.com失败有效,wrong.host.badssl.com因为证书通配符名称匹配仅执行一个(最左边的)DNS 标签而不是更多(这将需要两个)。
expired.badssl.com提供一个证书链,包括:
* https://crt.sh/?id=7176112 Leaf *.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 指纹 02FAF3E291435468607857694DF5E458B688。但是,COMODO RSA 现在有自己的根https://crt.sh/?id=1720081日期为 2010 年(直到 2038 年),SHA1 指纹 AFE5D244A8D1194230FF479FE2F897BBCD7A8CB4 被广泛接受——包括从 8u51 开始的 Oracle Java。(AddTrust External 可以追溯到更远的地方,至少是 6u07,这是我可以轻松检查的最旧的。)我敢打赌,如果您仔细观察,您会发现 Safari将接收链顶部的 COMODO RSA 的桥接证书替换为 (COMODO RSA) ) 根; 在这种情况下,任何依赖者都可以执行这种快捷方式,我的(近乎当前的)Firefox、IE 和 Chrome/Windows 都可以。(后两者共享 Windows 信任库;Firefox 使用 Mozilla。)
(检查清单的 PS:我使用 SHA1 指纹,因为它们更容易剪切和粘贴并且仍然足够好——已经发现某些数据的 SHA1 冲突,但不是完整的证书,由于签名相关性而更难,无论如何只有第二个- 原像实际上是一个问题,AFAIK 根本没有人在这方面取得任何进展。)
由于上面引用的 RFC,您标题中的问题“仅给定叶证书”不应该出现在 TLS 中。但如果确实如此,这几乎是OpenSSL 生成证书链的副本,并且适用相同的逻辑:跟随 CAIssuers,或(幸运的话)CT 日志上的链——就像我为上述手动所做的那样!
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |