【问题标题】:OpenSSL reasonable default for trusted CA certificates?OpenSSL 可信 CA 证书的合理默认值?
【发布时间】:2012-04-10 20:05:52
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ssl openssl


    【解决方案1】:

    这是我最终做的:

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

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

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

    【讨论】:

    【解决方案2】:

    在 OS X 上,您可以从用户的钥匙串中获取有关用户信任的证书的信息。这是一个链接,其中包含一些关于使用 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 的系统上正确获取它。

    【讨论】:

    • 您知道certtool 对于明确标记为“从不信任”的证书的行为方式吗?
    • 我认为 certtool 不会显示任何有关信任级别的信息;您想使用不同的机制查询信任度。如果您真的喜欢为此使用命令行工具,请尝试man security 一种好方法。
    • 另见 MacPorts 的 certsync 实用程序(trac.macports.org/browser/trunk/dports/security/certsync/#files,实际代码在 files/certsync.m),它还将受信任的根导出到文件中并注意信任标志(通过不导出他们)。
    【解决方案3】:

    您可以使用 curl's script 来转换来自 Mozilla 的列表(来自 Curl's maintainer's answer)。根据its code的说法,似乎在包含之前检查证书是否受信任。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 2016-07-26
      • 2012-04-10
      • 2015-01-12
      • 2013-03-25
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多