【问题标题】:Determining if a TLS/SSL certificate is 'trusted' from the command line?从命令行确定 TLS/SSL 证书是否“受信任”?
【发布时间】:2012-12-27 14:27:24
【问题描述】:

我希望能够从命令行确定远程域的 TLS/SSL 证书是否“受信任”。

这是我几周前玩的一个 openssl 示例,这里我使用 openssl 获取证书,然后将其通过管道传递给 openssl 的“验证”命令。我假设“验证”命令将验证证书,但是,我现在的理解是“验证”命令只是验证证书链(我认为)。 (cdn.pubnub.com 只是我从 Twitter 快速搜索中找到的一个域作为示例使用)

echo "GET /" | openssl s_client -connect cdn.pubnub.com:443 | openssl x509 -text | openssl verify

正如您从cdn.pubnub.com 域中看到的(在撰写本文时),浏览器(至少 Chrome)不信任证书(因为证书域不匹配),但是,openssl 'verify ' 命令不会输出 'trusted' 或 'nottrusted' 或其他我们可以从中推断信息的内容。

我想到的另一种方法是使用无头浏览器(例如PhantomJS)并解析它们返回的任何错误。事实证明,PhantomJS 只是错误但没有给出任何细节,因此不能使用,因为错误可能是由其他原因引起的。

我不认为从命令行找出证书是否受信任会这么难,而不必解析和检查使证书自己信任的所有数据,我认为这不会聪明点。

是否有库或其他方式可以让我从命令行判断远程域的证书是否受信任?

【问题讨论】:

    标签: security ssl openssl certificate phantomjs


    【解决方案1】:

    这取决于您认为“可信”的内容。除了核心加密检查(例如检查数字签名)外,客户端通常会执行以下操作:

    1. 检查证书是否链接到受信任的根

    2. 验证当前时间是否在 notValidBefore 和 not validAfter 属性之间。

    3. 证书未被吊销。

    4. keyUsage 和其他证书约束匹配。

    5. 我们正在通信的实体以某种方式在证书的主题中找到(对于服务器,这通常意味着主机名被列为 CN 或 subjectAlternativeName)。

    在您的情况下,缺少验证步骤 5 的信息(即主机名),因此无法检查。您必须自己执行此步骤。 请注意,不同的客户端执行不同的检查以查看证书是否可信,因此一个答案可能不适用于所有可能的客户端。如果您想深入检查您的安装,请考虑使用来自 ssl labs https://www.ssllabs.com/ssltest 的检查/

    【讨论】:

      【解决方案2】:

      curl(和libcurl)对 https URL 使用 OpenSSL,并检查证书有效性,除非启用了 -k, --insecure 选项。

      zsh 29354 % curl https://cdn.pubnub.com/
      curl: (51) SSL peer certificate or SSH remote key was not OK
      

      如您所见,它并没有详细说明证书无效的原因,但除此之外它应该与无头浏览器一样好,而且更轻便。

      【讨论】:

      • 这似乎应该可以工作,我会做一些测试来看看它是如何扩展的。非常感谢您的回复。
      猜你喜欢
      • 2016-06-01
      • 2016-11-03
      • 2016-01-15
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多