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

Hea*_*eek 8 openssl

我正在使用的参考书(网络安全与OpenSSL,Viega,Messier和Chandra),第133页,指出:

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

我在OpenSSL文档中找不到任何有用的信息(毫不奇怪).在我看来,检查CRL应该是OpenSSL验证过程的自动部分.现在是否自动处理CRL,或者我是否仍然必须通过书中列出的所有垃圾来费力地验证证书是否未被撤销?

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

jco*_*and 7

接受的答案在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);
Run Code Online (Sandbox Code Playgroud)

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

编辑: OpenSSL和CRL还需要注意另外一点.如果在上下文中启用CRL,则任何CA没有CRL的证书都将被拒绝.据我所知,没有办法让OpenSSL只将CRL应用于它所拥有的CR中列出的CA的证书.

我遇到了这个问题并浪费了大量时间试图找出为什么我的证书在完全有效时不被接受.问题是我为一个CA添加了CRL,但没有为另一个CA添加.来自CA的所有没有CRL的证书都被拒绝.OpenSSL在这方面是全有或全无.


caf*_*caf 6

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);
Run Code Online (Sandbox Code Playgroud)