OCSP查询没有颁发者证书的中间证书
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OCSP查询没有颁发者证书的中间证书相关的知识,希望对你有一定的参考价值。
我编写了一个TLS代码,它在Java上进行相互身份验证,因此客户端在服务器发送证书后发送证书。我想验证OCSP证书链中的所有证书,它来自客户端到服务器端。
我编写了我的循环逻辑,假设最后一个证书是链中的根(CA)证书,而不是为它发送任何OCSP查询;
int certificateChainSize= x509Certificates.length;
// Verifies certificate chain respectively (issuer certificate required).
CertificateResult response = null;
try {
for (int i = 0; i < certificateChainSize-1 ; i++) {
response = client.verify(x509Certificates[i], x509Certificates[i+1]);
}
} catch (OcspException e) {
e.printStackTrace();
}
当我测试TLS并获得Wireshark捕获时,我意识到Google Chrome作为客户端一直在发送没有root的证书链。结果是;由于循环逻辑,因此我的代码假定中间证书是root,因此不会查询中间证书。我需要颁发者证书来验证链中的任何证书。是否有没有颁发者证书的机制验证(以防:根证书)。
我认为,你的设计存在缺陷。
当您没有根证书时,不需要针对OCSP服务器验证证书,因为该链是不可信的,并且OCSP验证没有意义。
在主要的加密库中,撤销检查作为构建所有可能的证书链的最后一步发生,选择最佳链并且根据各种验证规则成功验证(其中大多数在§6 of RFC 5280 中描述)。只有当所有检查都成功时,客户端才会尝试对链中的每个证书进行吊销检查。成功的链构建和验证将暗示您已经拥有受信任的根证书,因为有效链构建为根证书。
另外,正如你在之前的帖子Force Chrome to send all certificates in chain during TLS中所说:
为了获得最大的兼容性,所有实现都应该准备好处理来自任何TLS版本的潜在无关证书和任意排序,但必须首先是最终实体证书。
该声明暗示随后的i+1
证书可能不是当前i
证书的发行者所必需的。结果,这一行:
response = client.verify(x509Certificates[i], x509Certificates[i+1]);
将返回意外的结果,因为它的输入是错误的。
你真正应该做的是:让操作系统加密库(作为操作系统的一部分提供)来完成最艰苦的工作。我强烈建议不要发明自己的加密并使用经过验证的工具。每个操作系统都有API,可以构建,安排和验证证书链,并为您提供最好的证书链。您应该使用此链作为OCSP验证代码的输入,并且您的for
循环将被视为可靠(取决于verify
方法的内部逻辑)。
就像我说的,如果链构建过程失败,没有太多理由进行OCSP验证。
以上是关于OCSP查询没有颁发者证书的中间证书的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到 APNS:返回代码 20(无法获取本地颁发者证书)
Paypal Access - SSL 证书:无法获取本地颁发者证书
Paypal Access - SSL 证书:无法获取本地颁发者证书