OpenSSL C API:使用 CRL 的证书链验证
OpenSSL C API: Certificate chain validation with CRL
我正在尝试使用 OpenSSL 1.0.2 C API.
对 Windows 个可执行文件执行证书链验证,其中还包括检查已撤销的证书
我在本地存储了 CRL 文件,我想在验证期间加载它们(而不是通过 "CRL Distribution Points" URL 从拥有它的证书下载 CRL)。
这是我加载单个 CRL 文件的简化示例(省略任何错误检查):
X509_STORE *store = NULL;
X509_STORE_CTX *ctx = NULL;
X509_VERIFY_PARAM *params = NULL;
X509_CRL *crl = d2i_X509_CRL_fp(fc, NULL); // fc is a file pointer to CRL file
X509_STORE_add_crl(store, crl);
X509_STORE_CTX_init(ctx, store, NULL, NULL);
params = X509_STORE_CTX_get0_param(ctx);
X509_VERIFY_PARAM_set_purpose(params, X509_PURPOSE_ANY);
X509_VERIFY_PARAM_set_flags(params, X509_V_FLAG_CRL_CHECK); // only want to check end entity
X509_STORE_set1_param(store, params);
// assume p7 is properly initialized PKCS7*
// assume bio is properly initialized BIO*
int ret = PKCS7_verify(p7, p7->d.sign->cert, store, bio, NULL, 0);
以上代码将 return ret == 0
错误:unable to get certificate CRL
,根据我的理解,这意味着 OpenSSL 仍在尝试从证书本身搜索 CRL,而不是使用我的证书本地加载。
完成这项任务的正确方法是什么?
实际上上面的代码已经正确地实现了我执行CRL检查的目标。
对于 X509 证书结构的新手来说,一个潜在的陷阱是 感兴趣的证书的 "CRL Distribution Points" URL 包含在该证书本身中,而不是在颁发者的证书中证书。这是我的错误,导致了我提到的错误。希望对刚入门的人理解X509标准有所帮助
我正在尝试使用 OpenSSL 1.0.2 C API.
对 Windows 个可执行文件执行证书链验证,其中还包括检查已撤销的证书我在本地存储了 CRL 文件,我想在验证期间加载它们(而不是通过 "CRL Distribution Points" URL 从拥有它的证书下载 CRL)。
这是我加载单个 CRL 文件的简化示例(省略任何错误检查):
X509_STORE *store = NULL;
X509_STORE_CTX *ctx = NULL;
X509_VERIFY_PARAM *params = NULL;
X509_CRL *crl = d2i_X509_CRL_fp(fc, NULL); // fc is a file pointer to CRL file
X509_STORE_add_crl(store, crl);
X509_STORE_CTX_init(ctx, store, NULL, NULL);
params = X509_STORE_CTX_get0_param(ctx);
X509_VERIFY_PARAM_set_purpose(params, X509_PURPOSE_ANY);
X509_VERIFY_PARAM_set_flags(params, X509_V_FLAG_CRL_CHECK); // only want to check end entity
X509_STORE_set1_param(store, params);
// assume p7 is properly initialized PKCS7*
// assume bio is properly initialized BIO*
int ret = PKCS7_verify(p7, p7->d.sign->cert, store, bio, NULL, 0);
以上代码将 return ret == 0
错误:unable to get certificate CRL
,根据我的理解,这意味着 OpenSSL 仍在尝试从证书本身搜索 CRL,而不是使用我的证书本地加载。
完成这项任务的正确方法是什么?
实际上上面的代码已经正确地实现了我执行CRL检查的目标。 对于 X509 证书结构的新手来说,一个潜在的陷阱是 感兴趣的证书的 "CRL Distribution Points" URL 包含在该证书本身中,而不是在颁发者的证书中证书。这是我的错误,导致了我提到的错误。希望对刚入门的人理解X509标准有所帮助