【问题标题】:validating X.509 certificate on linux在 Linux 上验证 X.509 证书
【发布时间】:2010-07-20 09:38:28
【问题描述】:
我刚刚开始使用 X.509 证书。谁能告诉我如何在linux上验证证书?用例是我的应用程序在前一个会话中下载了一个证书,我必须在开始新会话之前检查它是否仍然有效(即自存储以来未过期或撤销)。我知道这里不可能提供完整的示例,但任何指针都会很有用。
编辑:进一步调查发现了另一个名为网络安全服务 (NSS) 的实用程序。在可用性方面与 OpenSSL 相比如何?此外,我正在寻找编程解决方案,因为我将无法启动命令行实用程序。
【问题讨论】:
标签:
c
linux
openssl
x509
nss
【解决方案1】:
正如其他人提到的,您可以使用openssl verify。根据documentation,也检查有效期。
以编程方式,这可能意味着需要花费数小时搜索有点糟糕(或缺失)的文档,阅读整个网络上的代码示例,并且可能会让人头疼。
要正确验证证书,您需要通知所有中间证书。通常您还会通知撤销列表 (CRL),但这不是必需的。
所以,就代码而言,这是您需要做的事情(OpenSSL):
-
X509_STORE_new - 创建证书存储;
-
X509_STORE_CTX_new - 创建商店上下文;
-
X509_STORE_add_cert - 将 CA(和所有中介)证书添加到证书存储的受信任列表中(注意:有一个查找/加载列表的功能);
-
X509_STORE_add_crl - 将撤销的证书添加到证书存储的 CRL 中(注意:同上);
-
X509_STORE_CTX_init - 初始化您的存储上下文,通知您的证书存储;
-
X509_STORE_CTX_set_purpose - 如果需要,请定义目的;
-
X509_STORE_CTX_set_cert- 告诉上下文您要验证哪个证书;
-
X509_verify_cert - 最后,验证它;
-
X509_STORE_CTX_cleanup - 如果您想重用上下文来验证另一个证书,请将其清理并跳回 (5);
- 最后但同样重要的是,释放 (1) 和 (2);
或者,可以使用X509_verify 进行快速验证。但是请注意,它仅比较签名。
当我需要它时,我花了一天的时间搜索、阅读和测试。然后我发现我需要的一切都在 OpenSSL 源代码中。因此,如果您需要示例,请直接访问 openssl-xxx/apps/verify.c。
重要提示:切勿使用 MD5。要了解原因,请阅读Creating a rogue CA certificate。
【解决方案2】:
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。)
【解决方案3】:
OCSP 是用于检查证书吊销的协议。 Openssl 提供证书链验证和签名验证 API。它需要一些编码。所以我建议你查看Openssl 文档。
您必须通过证书链并对其进行验证,直到您获得应该已经保存在您的机器上的根证书。这是由称为根 CA(证书颁发机构)的实体颁发的自签名证书
除了 OCSP 之外,还有一个过时的方法,您必须获取撤销列表,即 CRL,并解析该列表以获取证书 ID。
编辑:
我忘了提到具有相同功能的 openssl 命令行实用程序。