使用 openssl 根据 CRL 验证证书链

Verify certificate chain against CRL with openssl

我正在尝试了解证书和 CRL 处理,因此我创建了以下示例证书链:

根 CA(自签名)→ 中间 CA(由根 CA 签名)→ 服务器证书(由中间 CA 签名)

现在我想测试证书吊销是否有效。为此,我撤销了服务器证书并相应地创建了一个(中间 CA 的)CRL 文件。 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 和 "crawls up" 证书链,以便对其进行全面验证。

我试过

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 验证整个证书链),我将不胜感激。提前致谢!

确实我犯的错误主要有两个:

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

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

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

现在有效。

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