在linux上验证X.509证书

时间:2010-07-20 09:38:29

标签: c linux openssl x509 nss

我刚开始使用X.509证书。谁能告诉我如何在linux上验证证书?用例是我的应用程序在之前的会话中下载了证书,我必须在开始新会话之前检查它是否仍然有效(即,在存储之后没有过期或撤销)。我知道这里不可能有完整的样本,但任何指针都会有用。

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

3 个答案:

答案 0 :(得分:18)

正如其他人提到的,您可以使用openssl verify。根据{{​​3}},它还会检查有效期。

从编程方面来说,这可能意味着需要花费数小时搜索有缺陷(或缺失)的文档,在整个网络上阅读代码示例,并且可能很头疼。

要正确验证证书,您需要通知所有中间证书。通常你也会通知撤销列表(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);
  11. 或者,可以使用X509_verify进行快速验证。但请注意,它仅对签名进行比较。

    当我需要它时,花了我一整天的搜索,阅读和测试。然后我发现我需要的一切都在OpenSSL源代码中。因此,如果您需要一个示例,请直接转到 openssl-xxx / apps / verify.c

    重要提示:绝对不要使用MD5。要了解原因,请阅读documentation

答案 1 :(得分: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/emailAddress=hostmaster@spi-inc.org
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。)

答案 2 :(得分:0)

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

您必须通过证书链并对其进行验证,直到您获得应该已保存在计算机上的根证书。这是由称为根CA(证书颁发机构)

的实体颁发的自签名证书

除了OCSP之外,还有一种过时的方法,你必须获取撤销列表即CRL并解析证书ID的列表。

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