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