【发布时间】:2020-06-26 07:42:17
【问题描述】:
我正在尝试了解证书和 CRL 处理,因此我创建了以下示例证书链:
根 CA(自签名)→ 中间 CA(由根 CA 签名)→ 服务器证书(经中间 CA 签名)
现在我想测试证书吊销是否有效。为此,我撤销了服务器证书并相应地创建了一个 CRL 文件(属于中间 CA)。 X509v3 CRL 分发点存在于所有证书文件中,它们可以通过 http 访问,例如:
X509v3 CRL Distribution Points:
Full Name:
URI:http://127.0.0.1:80/intermediate_ca.crl
(这是我刚刚创建的 CRL。(对于 http://127.0.0.1:80/ca.crl 的根 CA CRL 也是如此。)我仔细检查了它们是否真的存在并且可以在该 URI 中访问。)
接下来,我将cat Root CA pem 文件和Intermediata CA pem 文件放入CAChain.pem。
我想要一个接收服务器证书和CAChain.pem 的命令,并“爬上”证书链,以便对其进行总体验证。
我试过了
openssl verify -extended_crl -crl_check_all -crl_download -CAfile CAChain.pem -verbose serverCert.pem
但我只是得到:
Error loading CRL from http://127.0.0.1:80/ca.crl
140041593399104:error:27076072:OCSP routines:parse_http_line1:server response error:crypto/ocsp/ocsp_ht.c:260:Code=404,Reason=Not Found
...
error 3 at 0 depth lookup: unable to get certificate CRL
同样,CRL确实出现在所表示的 URI 中。这就是为什么我无法解释错误 404 的原因。(此外,我觉得这个错误是由 OSCP 模块引起的,因为我目前只是使用 CRL。)
如果有人能告诉我我的错误是什么以及如何实现我最初的意图(使用 CRL 验证整个证书链),我将不胜感激。提前致谢!
【问题讨论】:
-
(1) 是的,
apps/apps.c中的load_cert_crl_http(重新)将crypto/ocsp/ocsp_ht.c中的OCSP_REQ*函数用于HTTP,大概是因为它们在@ 之前已经编写过(之前的几个版本) 1.0.2 中添加了 987654334@。 (2) 您说 CRL 可在/intermediate_ca.crl和/root_ca.crl获得,但至少有一个在/ca.crl。这两个都对吗?你怎么检查?如果您使用的是浏览器或类似的浏览器,请尝试使用curl之类的简单方法,以确保您没有获得任何基于缓存、代理或用户代理的“功能”。 ... -
... (3) 如果您不知道,根据 SSL/TLS 标准,服务器应该发送链,但(可选)root 除外,因此客户端不需要 中间存储,尽管它可以选择;要更准确地匹配
verify中的标准大小写,请使用-untrusted intermediate(s)和-CAfile/path root(s)only。 (但这不会影响您当前的问题。) -
(1) 好的,感谢您的澄清! (2) 对不起,我的错。根 CA crl 确实位于
ca.crl。 (我发现这有点难看,所以我在帖子的第一部分更改了它,但没有在下面进一步更改。)我现在编辑了我的问题以更正它。我只是在做一个wget http://127.0.0.1:80/ca.crl(当然来自同一台机器),它会很好地下载 CRL。中间没有代理或其他东西......(3)再次感谢你 - 我真的有点困惑在哪里发送/创建链! -
很奇怪。如果是我,我会调试服务器以查看为什么会出现不同的结果,否则会调试客户端(使用用符号构建的 openssl)或插入像 Burp、Charles、Fiddler 这样的 HTTP 检查器来尝试找出差异。祝你好运。
标签: ssl openssl ssl-certificate verification certificate-revocation