使用 openssl 检查 PKCS#7 中的根证书是否被撤销

Using openssl to check if root certificate in PKCS#7 is revoked

这是从 C/C++ 库中提取的 pkcs7_verify 签名:

int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
             BIO *indata, BIO *out, int flags);

它可以与 PKCS7 块 (p7) 和它要签名的部分(在数据中)一起使用。

我想知道此检查如何检测链中的证书之一是否被吊销...

据我所知,只有在与 pkcs7 块之外的另一个证书匹配时才能进行吊销检查,该证书被标记为已吊销。

我检查了函数参数并找到了一个代表商店信任证书列表的参数。

此 arg 应包含证书,该证书是 pkcs7 链中最低证书的颁发者。所以我的猜测是,如果该证书被标记为已撤销,我们将无法通过 revocation 原因检查...

但是,如果链中更高级别的另一个证书被吊销怎么办?我如何向 pkcs7_verify 提供这条信息?

或者也许还有另一种 openssl 方法可以决定链中的证书是否被吊销?

更新:

我找到了另一种检查证书是否被吊销的方法。在下面的示例中,我们可以看到 revoked_test.pem 通过与 crl_chain.pem 中的列表匹配来识别为已撤销。我怎样才能以编程方式做到这一点?

openssl verify -crl_check -CAfile crl_chain.pem revoked-test.pem 
revoked-test.pem: OU = Domain Control Validated, OU = PositiveSSL, CN = xs4all.nl
error 23 at 0 depth lookup:certificate revoked

谢谢

认证路径验证的大部分规则都在您传递给 PKCS7_verify 函数的 X509_STORE 结构中设置。

This example 显示如何构建完整的 X509_STORE 并解释如何在 X509_STORE. 中激活 CRL 验证(示例适用于设置 crl 验证但不适用于证书链处理)

核心功能是:

  • X509_STORE_set_flags
  • X509_STORE_add_crl
  • X509_STORE_add_lookup

您使用 X509_STORE_set_flags 告诉证书存储执行 CRL 验证。您需要的标志是:X509_V_FLAG_CRL_CHECK_ALL | X509_V_FLAG_CRL_CHECK。您可以找到所有标志 here.

您使用X509_STORE_add_crl 添加 CRL 以进行验证。 CRL 不需要来自根 CA。

作为 X509_STORE_add_crl 的一个选项,您可以使用 X509_STORE_add_lookup 添加一个函数来在任何地方(例如:文件系统、数据库、url 等)查找 CRL。

执行链验证时,OpenSSl 将使用 X509_STORE 中的 CRL 和查找函数来验证链中的所有证书。如果链中的任何证书被吊销,则返回错误。

重要的是要补充一点,the X.509 certification path validation 规范不包括信任锚(通常是根证书)的验证。信任锚下的链中所有证书都必须被验证,但信任锚是可信的,因为验证者将其设置为如此(即:信任锚验证被验证者越界)。