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

Rya*_*per 10 ssl openssl

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

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

近期版本的Linux的答案似乎是打电话SSL_CTX_load_verify_locations/etc/ssl/certs/ca-certificates.crt(如果该文件存在).

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

Rya*_*per 9

这是我最终做的事情:

在Windows上:获得从Windows证书"ROOT"证书库中CertOpenSystemStore,环比他们使用CertEnumCertificatesInStore了,从在X509编码的原始证书pbCertEncoded的领域CERT_CONTEXT,创建一个OpenSSL的X509使用结构d2i_X509,并用它添加到OpenSSL的证书存储区X509_STORE_add_cert.Windows功能都可以从crypt32.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 ,该回调使用OS函数来验证单个根证书,而不是将它们全部复制过来,但我还没有尝试过.


the*_*aul 5

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

获取钥匙串证书

如果Cocoa不是您需要的依赖项,并且您希望直接从命令行执行所有操作,则可以使用实用程序 - certtool请参阅man certtool和其他联机文档来了解它.要列出用户登录密钥链中的所有证书,您可以执行以下操作:

certtool y k=login.keychain
Run Code Online (Sandbox Code Playgroud)

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

certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain
Run Code Online (Sandbox Code Playgroud)

有可能

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain
Run Code Online (Sandbox Code Playgroud)

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

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


Bru*_*uno 5

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