2010-07-20 187 views
5

我刚开始使用X.509证书。任何人都可以告诉我如何在linux上验证证书吗?用例是我的应用程序在之前的会话中下载了一个证书,并且在开始新会话之前,我必须检查它是否仍然有效(即未存储过期或从存储中撤销)。我明白这里不可能有完整的示例,但任何指针都会有用。验证Linux上的X.509证书

编辑:进一步调查显示另一个实用工具称为网络安全服务(NSS)。在可用性方面,这与OpenSSL相比如何?另外,我正在寻找程序化解决方案,因为我将无法启动命令行实用程序。

+0

可能重复的[x509证书验证在C](http://stackoverflow.com/questions/2756553/x509-certificate-verification-in-c) – jww 2014-03-03 05:20:47

回答

0

OCSP是检查证书撤销的协议。 Openssl提供证书链验证和签名验证API。它需要一些编码。所以我建议你看看Openssl文档。

您必须通过证书链并验证它,直到您到达应已保存在您的计算机上的根证书。这是由实体称为根CA(证书颁发机构)颁发的自签名证书

除了OCSP,还有一种过时的方法,您必须获取吊销列表,即CRL并解析该证书标识的列表。

编辑: 我忘了提及openssl命令行实用程序,它具有相同的功能。

3

openssl verify会做你想要什么,如果你想有一个简单的工具:

从运行:

cd /usr/share/ca-certificates 
find . -type f -exec openssl -verify {} \; 

这里有一个选择的输出:

./telesec.de/deutsche-telekom-root-ca-2.crt: OK 
./brasil.gov.br/brasil.gov.br.crt: OK 
./cacert.org/cacert.org.crt: OK 
./spi-inc.org/spi-ca-2003.crt: /C=US/ST=Indiana/L=Indianapolis/O=Software in the Public Interest/OU=hostmaster/CN=Certification Authority/[email protected] 
error 10 at 0 depth lookup:certificate has expired 
OK 
./spi-inc.org/spi-cacert-2008.crt: OK 
./signet.pl/signet_ocspklasa3_pem.crt: /C=PL/O=TP Internet Sp. z o.o./CN=CC Signet - CA Klasa 3/serialNumber=Numer wpisu: 4 
error 2 at 1 depth lookup:unable to get issuer certificate 
./signet.pl/signet_ca3_pem.crt: /C=PL/O=TP Internet Sp. z o.o./CN=CC Signet - CA Klasa 3/serialNumber=Numer wpisu: 4 
error 20 at 0 depth lookup:unable to get local issuer certificate 

如果你愿意而是在一个更大的程序中得到结果,或许gnutls_x509_crt_verify(3),gnutls_x509_crt_get_key_usage(3),gnutls_x509_crt_check_revocation(3)接口比OpenSSL更容易使用。 (我从未使用gnutls,但我使用已使用OpenSSL。)

18

正如其他人提到的,您可以使用openssl verify。根据documentation,它也检查有效期。

以编程方式,它可能意味着几小时的搜索有点不好(或缺少)文档,阅读遍布整个网络的代码示例,并可能是一个头痛的问题。

要正确验证证书,您需要通知所有中间证书。通常你也会通知撤销清单(CRL),但这不是必需的。

所以,这里就是你需要(OpenSSL的)的代码方面做什么:

  1. X509_STORE_new - 创建一个证书存储区;
  2. X509_STORE_CTX_new - 创建商店上下文;
  3. X509_STORE_add_cert - 将CA(和所有中介)证书添加到证书存储的可信列表(注意:有查找/加载列表的功能);
  4. X509_STORE_add_crl - 将撤销的证书添加到证书存储区的CRL(注意:与上面相同);
  5. X509_STORE_CTX_init - 初始化您的商店环境,通知您的证书商店;
  6. X509_STORE_CTX_set_purpose - 定义目的,如果你需要的话;
  7. X509_STORE_CTX_set_cert - 告诉上下文你要验证哪个证书;
  8. X509_verify_cert - 最后,验证它;
  9. X509_STORE_CTX_cleanup - 如果您想重新使用上下文来验证另一个证书,请将其清理并跳回到(5);
  10. 最后但并非最不重要的是,释放(1)和(2);

或者,可以使用X509_verify进行快速验证。但是请注意,它仅对比签名。

当我需要它时,花了我一天的搜索,阅读和测试。然后我想出了我需要的所有东西在OpenSSL源代码中都是正确的。因此,如果您需要示例,请直接拨打openssl-xxx/apps/verify.c

重要提示:切勿使用MD5。要了解原因,请阅读Creating a rogue CA certificate

+0

你能告诉我如何使用查找/加载列表 – Balamurugan 2011-07-08 04:30:36