Java 如何获得仅提供叶证书的证书链?
我正在尝试实现一个定制的Java 如何获得仅提供叶证书的证书链?,java,ssl,certificate,ssl-certificate,x509certificate,Java,Ssl,Certificate,Ssl Certificate,X509certificate,我正在尝试实现一个定制的X509TrustManager,它告诉用户有关证书的信息,并让用户能够在出现问题的情况下继续使用服务器 我已经把几乎所有的东西都连接在一起,并开始测试上的各种证书 当我访问Safari时,我看到三个证书: * COMODO RSA Certification Authority * COMODO RSA Domain Validation Secure Server CA * *.badssl.com 我的应用程序得到了完整的链接 但是,当我
X509TrustManager
,它告诉用户有关证书的信息,并让用户能够在出现问题的情况下继续使用服务器
我已经把几乎所有的东西都连接在一起,并开始测试上的各种证书
当我访问Safari时,我看到三个证书:
* COMODO RSA Certification Authority
* COMODO RSA Domain Validation Secure Server CA
* *.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”证书中的“颁发者”名称以某种方式查找根证书,但在哪里可以找到它?用于验证服务器链(或通常任何接收到的链)的根证书应该在本地信任库中找到。这正是默认的
TrustManager
所做的——它在本地信任库中查找,或者更确切地说,它实例化了一个CertPathValidator
,它(通常)默认为PKIXValidator
,在信任库(包含证书项的密钥库)中查找通常从默认为JRE/lib/security/cacerts
的本地文件初始化,然后执行验证器,该验证器通过使用HashMap
按主题名称从所述信任库中查找根进行验证
虽然只是简单地说明了这一点(1.1版本为4346,1.0版本为2346)
如果你仔细观察,你会发现这些案例实际上并没有你想象的那么不同
error.host.badsl.com
提供由以下内容组成的证书链:*由DigiCert SHA2 SecServerCA发布的leaf*.badsl.com
*DigiCert GlobalRootCA发布的中间版本
它使用带有SHA1指纹的根目录A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436,您可以在大多数(如果不是所有的话)常见的信任库中找到它,包括Java(至少Oracle/Sun Java,OpenJDK可能因其构建方式不同而有所不同)。注意:此证书对
*.badsl.com
有效,但对错误的.host.badsl.com
无效,因为证书通配符名称匹配只匹配一个(最左侧)DNS标签,而不匹配更多(这将需要两个)
expired.badsl.com
提供由以下内容组成的证书链:*科摩多·罗萨多曼瓦尔卡发布的leaf*.badsl.com
*由科摩罗卫星证书颁发的中级证书
*由AddTrust ExternalRoot于2000年发布(至2020年)
发送时使用带有SHA1指纹的AddTrust根02FAF3E29143546806607857694DF5E45B68851868。但是,COMODO RSA现在有自己的根目录,日期为2010年(直到2038年),SHA1指纹AFE5D244A8D1194230FF479FE2F897BBCD7A8CB4已被广泛接受,包括Oracle Java从8u51开始的版本。(AddTrust External可以追溯到更远的地方,至少是6u07,这是我可以很容易检查到的最早的。)我打赌如果你看一下,你会发现Safari将接收链顶部的COMODO RSA桥接证书替换为(COMODO RSA)根证书;任何改版者都可以进行这种快捷操作,而我的(几乎是最新的)Firefox、IE和Chrome/Windows在这种情况下都可以。(后两者共享Windows truststore;Firefox使用Mozilla。) (检查列表者提示:我使用SHA1指纹是因为它们更容易剪切和粘贴,而且仍然足够好——一些数据已经发现了SHA1冲突,但由于签名相关性,没有完整的证书,这更难,而且无论如何,只有第二张前照会是一个问题,而且目前还没有人在这方面取得任何进展l、 )
由于上面提到的RFC,您标题中的问题“仅提供叶证书”不应出现在TLS中。但如果出现,这几乎是重复的,同样的逻辑适用:遵循CAIssuers,或(幸运的话)CT日志上的链--正如我为上面所做的那样!用于验证服务器链(或通常任何接收到的链)的根证书应该在本地信任库中找到。这正是默认的
TrustManager
所做的--它在本地信任库中查找,或者更确切地说,它实例化了一个CertPathValidator
(通常)默认为PKIXValidator
,它在信任库(包含证书项的密钥库)中查找通常从默认为JRE/lib/security/cacerts
的本地文件初始化,然后执行验证器,该验证器通过使用HashMap
按主题名称从所述信任库中查找根进行验证
虽然只是简单地说明了这一点(1.1版本为4346,1.0版本为2346)
如果你仔细观察,你会发现这些案例实际上并没有你想象的那么不同
error.host.badsl.com
提供由以下内容组成的证书链:*由DigiCert SHA2 SecServerCA发布的leaf*.badsl.com
*DigiCert GlobalRootCA发布的中间版本
它使用带有SHA1指纹的根目录A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436,您可以在大多数(如果不是所有的话)常见的信任库中找到它,包括Java(至少Oracle/Sun Java,OpenJDK可能因其构建方式不同而有所不同)。请注意,此证书对
*。badsl.com
无效,原因是错误。host.badsl.com
,因为证书通配符名称匹配只匹配一个(最左侧)DNS标签,而不匹配更多(这将需要两个)
expired.badsl.com
提供由以下内容组成的证书链:*科摩多·罗萨多曼瓦尔卡发布的leaf*.badsl.com
*由科摩罗卫星证书颁发的中级证书
*由AddTrust ExternalRoot于2000年发布(至2020年)
发送时使用带有SHA1指纹的AddTrust根02FAF3E291435468607857694DF5BE45688581868。但是,COMODO RSA现在有自己的根,日期为2010年(直到2038年),SHA1指纹AFE5D244A8D1194230FF479FE2F897BBCD7A8CB4已被广泛接受,包括Oracle Java 8u51。(AddTrust External的历史可以追溯到更远的地方,至少是6u07,这是我能轻松找到的最古老的