2010-12-08 337 views
8

我是从工作(网络安全与OpenSSL的,由Viega,梅西耶和Chandra),第133页上的参考书,指出:OpenSSL现在是否自动处理CRL(证书吊销列表)?

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

我在OpenSSL文档中找不到有关它的任何可用信息(此处并不令人意外)。在我看来,检查CRL应该是OpenSSL验证过程的自动部分。 CRL现在是否自动处理,还是必须通过本书中列出的所有垃圾来努力验证证书没有被撤销?

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

回答

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); 
+0

谢谢,我很感激。 – 2010-12-09 22:59:16

5

接受的答案做在的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和CRLs。如果您在上下文中启用CRL,则任何CA没有CRL的证书都将被拒绝。据我所知,没有办法让OpenSSL仅将CRL应用于其拥有的CRL中列出的CA的证书。

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