OpenSSL 现在会自动处理 CRL(证书撤销列表)吗?

Posted

技术标签:

【中文标题】OpenSSL 现在会自动处理 CRL(证书撤销列表)吗?【英文标题】:Does OpenSSL automatically handle CRLs (Certificate Revocation Lists) now? 【发布时间】:2010-12-08 16:43:54 【问题描述】:

我正在使用的参考书(Network Security with OpenSSL,作者 Viega、Messier 和 Chandra)第 133 页指出:

[...] 应用程序必须加载 CRL 文件,以便内部验证过程确保其验证的每个证书都不会被撤销。不幸的是,OpenSSL 的 CRL 功能在 0.9.6 版本中不完整。使用 CRL 信息所需的功能将在从 0.9.7 开始的新版本中完成。 [...]

我在 OpenSSL 文档中找不到任何关于它的可用信息(这并不奇怪)。在我看来,检查 CRL 应该是 OpenSSL 验证过程的一个自动部分。现在 CRL 是自动处理的,还是我仍然必须通过书中列出的所有垃圾来费力地验证证书没有被吊销?

一个密切相关的问题:SSL_CTX_set_default_verify_paths 函数是否也加载 CRL 路径?

【问题讨论】:

【参考方案1】:

接受的答案在 libssl v0.9.8o 中不太适用。虽然代码与截至 2011/06/23 的在线文档页面底部的代码相匹配:

http://www.openssl.org/docs/crypto/X509_VERIFY_PARAM_set_flags.html

我使用了这个代码:

X509_STORE *store = getStore();

// Enable CRL checking
X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new();
X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
X509_STORE_set1_param(store, param);
X509_VERIFY_PARAM_free(param);

注意使用 X509_STORE 而不是 SSL_CTX 来设置参数。

编辑: OpenSSL 和 CRL 需要注意的另一件事。如果您在上下文中启用 CRL,任何其 CA 没有 CRL 的证书都将被拒绝。据我所知,没有办法让 OpenSSL 仅将 CRL 应用于它拥有的 CRL 中列出的 CA 的证书。

我遇到了这个问题,浪费了很多时间试图弄清楚为什么我的证书在完全有效的情况下没有被接受。问题是我为一个 CA 添加了 CRL,但没有为另一个 CA 添加 CRL。来自 CA 且没有 CRL 的所有证书都被拒绝。在这方面,OpenSSL 要么全有,要么全无。

【讨论】:

【参考方案2】:

SSL_CTX_set_default_verify_paths() 只加载 CA 路径,而不是 CRL。

我相信(虽然我自己还没有真正实现过)正确的过程是:

/* Load CRLs into the `X509_STORE` */

X509_STORE *x509_store = SSL_CTX_get_cert_store(ctx);
X509_STORE_add_crl(x509_store, crl);

/* Enable CRL checking */
X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new();
X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
SSL_CTX_set1_param(ctx, param);
X509_VERIFY_PARAM_free(param);

【讨论】:

以上是关于OpenSSL 现在会自动处理 CRL(证书撤销列表)吗?的主要内容,如果未能解决你的问题,请参考以下文章

联盟链系列 - 用Openssl管理CRL

联盟链系列 - 用Openssl管理CRL

OpenSSL C API:使用CRL进行证书链验证

Python OpenSSL - 验证 CRL 文件

从CRL列表中获取序列号

如何使用包括 CRL 分发点的 openssl 创建证书?