2017-09-26 135 views
0

我试图实现一个自定义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安全服务器CA”使用“发行人”的名字证书以某种方式查找根证书,但是其中我能找到它吗?

回答

3

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

尽管简单地陈述了这一点,但是in RFC 5246 for TLS 1.2(对于1.1和2346,对于1.0,从4346没有变化)。

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

wrong.host.badssl.com提供由以下组成的证书链:
* https://crt.sh/?id=205900989叶* .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有效的此证书由于证书通配符名称匹配只有一个(最左边的)DNS标签不多于(这将需要两个)而不适用于wrong.host.badssl.com

expired.badssl.com供应证书链由以下组成:* .badssl.com由COMODO RSADomainValCA发出
* https://crt.sh/?id=7176112
* https://crt.sh/?id=3509153中间由COMODO RSACertAuth发出
* https://crt.sh/?id=1044348桥发出2000(直到2020年)由AddTrust ExternalRoot
,它使用带有SHA1指纹02FAF3E291435468607857694DF5E45B68851868的AddTrust根https://crt.sh/?id=1。但是,COMODO RSA现在拥有自己的根目录https://crt.sh/?id=1720081,其日期为2010年(直到2038年),SHA1指纹AFE5D244A8D1194230FF479FE2F897BBCD7A8CB4得到了相当广泛的认可 - 包括Oracle Java开始8u51。 (AddTrust External可以更进一步,至少6u07这是我可以轻松查看的最老的)。我敢打赌,如果你看起来你会发现Safari 替换为 COMODO RSA的桥接证书, COMODO RSA)根;任何relier被允许做这种快捷方式,我的(近乎当前的)Firefox,IE和Chrome/Windows都可以做这种情况。 (后两种份额Windows的信任; Firefox使用Mozilla的)。

(PS为checklisters:我使用SHA1指纹,因为他们更容易切割&糊状,但仍不够好 - SHA1碰撞已经发现了一些数据,而不是完全证书这是更难,因为该签名相关的,反正只有第二原像实际上是一个问题,据我所知没有人上作出了任何进展都没有。)


问题在您的标题中,'仅给出叶证书',因为上面提到的RFC而不应该出现在TLS中。但是,如果是这样,这几乎是OpenSSL generate certificate chain的重复,并且适用相同的逻辑:遵循CAIssuers或(在运气上)CT日志中的链 - 就像我为上述操作一样!

+1

即使在这种情况下,我也不确定它是否会是该问题的重复,因为该问题是关于如何在openssl中执行的,而这个问题是关于如何在java中执行它,它没有方便的访问打开。 – Trejkaz

+0

@Trejkaz:公平点;合格 –