OpenSSL对可信CA证书的合理默认值是什么?

时间:2012-04-10 20:05:52

标签: ssl openssl

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

我不介意三次编写此代码(一次用于Windows,一次用于Mac OS X,一次用于Linux),但我更愿意限制它。特别是,我宁愿不尝试编写代码来寻找安装的浏览器并尝试提取其可信证书。 (显然它是easy to get this very wrong。)

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

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

3 个答案:

答案 0 :(得分:9)

这是我最终做的事情:

在Windows上:使用"ROOT"从Windows CertOpenSystemStore证书存储区获取证书,使用CertEnumCertificatesInStore循环访问它们,从pbCertEncoded获取X509编码的原始证书CERT_CONTEXT的字段,使用X509创建OpenSSL d2i_X509结构,并使用X509_STORE_add_cert将其添加到OpenSSL证书库。 Windows功能全部来自crypt32.dll

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

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

答案 1 :(得分:5)

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

Get Certificates in Keychain

如果Cocoa不是您需要的正确依赖项,并且您希望直接从命令行执行所有操作,则可以使用certtool实用程序 - 请参阅man 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是正确的方法。当安装ca-certificates软件包时,该文件将存在于Debian衍生产品(包括Ubuntu变种)上,而且我不确定如何在基于redhat的系统上正确地将其存在。

答案 2 :(得分:5)

您可以使用curl's script转换Mozilla中的列表(来自Curl's maintainer's answer)。根据{{​​3}},似乎在包含证书之前检查证书是否可信。