从命令行确定TLS / SSL证书是否“可信”?

时间:2013-01-13 15:04:34

标签: security ssl openssl certificate phantomjs

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

这是我几周前玩的一个openssl示例,在这里我使用openssl获取证书,然后将其传递给openssl的'verify'命令。我假设'verify'命令会验证证书,但是,我现在理解的是'verify'命令只是验证证书链(我认为)。 (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'命令不输出'信任'或'不信任'或我们可以从中扣除该信息的其他内容。

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

我不认为从命令行发现证书是否受信任是很难的,而不必解析和检查使证书成为我自己信任的所有数据,我认为不会是明智的。

我是否可以通过命令行信任远程域名证书的库或其他方式?

2 个答案:

答案 0 :(得分:5)

curl(和libcurl)将OpenSSL用于https网址,并检查证书有效性,除非启用了-k, --insecure选项。

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

如您所见,它没有详细说明证书无效的原因,但是它应该像无头浏览器一样好,而且要轻得多。

答案 1 :(得分:2)

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

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

  2. 确认当前时间介于notValidBefore和not validAfter属性之间。

  3. 证书未被撤销。

  4. keyUsage和其他证书限制匹配。

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

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

    中的检查