使用 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 规范不包括信任锚(通常是根证书)的验证。信任锚下的链中所有证书都必须被验证,但信任锚是可信的,因为验证者将其设置为如此(即:信任锚验证被验证者越界)。
这是从 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 规范不包括信任锚(通常是根证书)的验证。信任锚下的链中所有证书都必须被验证,但信任锚是可信的,因为验证者将其设置为如此(即:信任锚验证被验证者越界)。