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

时间:2018-11-21 09:07:57

标签: c++ c openssl x509certificate pkcs#7

这里的pkcs7_verify签名取自C / C ++库:

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

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规范不包括对信任锚(通常是根证书)的验证。信任锚下的链中的所有证书都必须进行验证,但是信任锚是可信的,因为验证者是这样设置的(即:验证者对信任锚进行了越界验证。)