【问题标题】:Verify certificate chain against CRL with openssl使用 openssl 验证针对 CRL 的证书链
【发布时间】: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


【解决方案1】:

确实,我主要犯了两个错误:

  • CRL 文件必须是 DER 格式,我不知道。 (从 PEM 格式转换很简单:openssl crl -in ${crlFile}.pem -outform DER -out ${crlFile})。
  • 当然,证书的 CRL 分发点必须是其 CA 之一。 (因此,例如,对于我的中间 CA,它必须是根 CA 之一。)

记住这一点,并将中间 CA 证书链接到服务器证书,正如 dave_thompson_085s 非常有用的 cmets 建议的那样,原始命令

openssl verify -extended_crl -crl_check_all -crl_download -CAfile CAChain.pem -verbose serverCert.pem

现在可以使用了。

我已经创建了一个 gist 来记录我目前所做的事情。它仍然很丑 - 我会整理它并在未来尝试使用 OCSP。

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2016-09-14
    • 2015-09-17
    • 2021-05-12
    相关资源
    最近更新 更多