我希望能够从命令行确定远程域的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只是错误,但没有提供任何细节,所以这不能用,因为错误可能是由其他原因引起的。
我不认为从命令行发现证书是否受信任是很难的,而不必解析和检查使证书成为我自己信任的所有数据,我认为不会是明智的。
我是否可以通过命令行信任远程域名证书的库或其他方式?
答案 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)
这取决于您认为“可信”的内容。除了核心加密检查(例如检查数字签名)之外,客户通常会执行以下操作:
检查证书是否链接到受信任的根
确认当前时间介于notValidBefore和not validAfter属性之间。
证书未被撤销。
keyUsage和其他证书限制匹配。
我们正在通信的实体以某种方式在证书的主题中找到(对于服务器,这通常意味着主机名被列为CN或subjectAlternativeName)。
在您的情况下,缺少验证步骤5(即主机名)的信息,因此无法检查。你必须自己做这个步骤。 请注意,不同的客户端执行不同的检查以查看证书是否可信,因此一个答案可能不适用于所有可能的客户端。如果您想深入检查安装,请考虑使用ssl labs https://www.ssllabs.com/ssltest /
中的检查