13

有没有办法SSL_CTX使用一组合理的可信 CA 证书设置 OpenSSL 上下文 (),而无需自己分发它们?我不想让他们保持最新的责任。IMO 任何现代操作系统都应该提供“让我获得受信任的 CA 证书”作为服务,但我不知道是否真的如此。

我不介意将这段代码写三遍(一次用于 Windows,一次用于 Mac OS X,一次用于 Linux),但我更愿意将其限制在这一点上。特别是,我宁愿不尝试编写代码来探听安装了哪些浏览器并尝试提取其受信任的证书。(显然这很容易弄错。)

最近版本的 Linux 的答案似乎是调用SSL_CTX_load_verify_locationswith /etc/ssl/certs/ca-certificates.crt(如果该文件存在)。

Windows 和 Mac OS X 是否有简单的答案?

4

3 回答 3

11

这就是我最终做的事情:

在 Windows 上:使用 从 Windows"ROOT"证书存储中获取证书,使用CertOpenSystemStore循环遍历它们,从 的字段中CertEnumCertificatesInStore获取 X509 编码的原始证书,使用 创建 OpenSSL结构,然后使用将其添加到 OpenSSL 证书存储中。Windows 功能都可从.pbCertEncodedCERT_CONTEXTX509d2i_X509X509_STORE_add_certcrypt32.dll

在 Mac OS X 上:使用 从"/System/Library/Keychains/SystemRootCertificates.keychain"钥匙串中获取证书,使用为钥匙串SecKeychainOpen中的证书创建迭代器,使用SecKeychainSearchCreateFromAttributes迭代SecKeychainSearchCopyNext,使用 获取原始 X509 证书SecItemExport,使用创建 OpenSSL 证书d2i_X509,然后使用 将其添加到 OpenSSL 存储中X509_STORE_add_cert。Mac 功能可从/Systems/Library/Frameworks/Security.framework/Security.

更好的方法可能是创建一个X509_STORE带有回调的 OpenSSL,该回调使用操作系统函数来验证单个根证书,而不是复制所有这些,但我还没有尝试过。

于 2013-10-26T21:36:49.203 回答
6

在 OS X 上,您可以从用户的钥匙串中获取有关用户信任的证书的信息。这是一个链接,其中包含一些关于使用 Cocoa 收集该信息的非常好的信息:

在钥匙串中获取证书

如果 Cocoa 不能满足您的需求,并且您想直接从命令行执行所有操作,则可以使用实用程序 - certtoolseeman certtool和其他在线文档来了解它。要列出用户登录钥匙串中的所有证书,您可以这样做:

certtool y k=login.keychain

或者获取内置可信系统根的列表:

certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain

有可能

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain

我确信还有其他方法可以使用系统接口获取该信息。

在 Linux 方面,是/etc/ssl/certs/ca-certificates.crt的,这是正确的方法。安装软件包后,该文件将存在于 Debian 衍生产品(包括 Ubuntu 变体)上ca-certificates,我不确定如何在基于 redhat 的系统上正确获取该文件。

于 2012-04-26T20:30:53.053 回答
5

您可以使用从 Mozilla 转换列表curl的脚本(来自Curl 的维护者的回答)。根据其代码,它似乎在包含证书之前检查证书是否受信任。

于 2012-04-26T20:38:20.797 回答