Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得仅提供叶证书的证书链?_Java_Ssl_Certificate_Ssl Certificate_X509certificate - Fatal编程技术网

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,这是我能轻松找到的最古老的