4

我希望能够从命令行确定远程域的 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'命令不输出“受信任”或“不受信任”或其他我们可以从中推断信息的内容。

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

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

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

4

2 回答 2

5

curl(and 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

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

于 2013-01-13T15:26:08.957 回答
3

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

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

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

  3. 证书不会被吊销。

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

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

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

于 2013-01-14T10:53:52.330 回答