我正在使用的参考书( Network Security with 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路径?
答案 0 :(得分: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);
答案 1 :(得分:6)
接受的答案在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应用于它所拥有的CA中列出的CA的证书。
我遇到了这个问题并浪费了很多时间试图找出为什么我的证书在完全有效时不被接受。问题是我为一个CA添加了CRL,但没有为另一个CA添加。来自CA的所有没有CRL的证书都被拒绝。 OpenSSL在这方面是全有或全无。