【问题标题】:What steps should I take to validate a SSL Certificate manually as browsers do?我应该采取哪些步骤来像浏览器一样手动验证 SSL 证书?
【发布时间】:2020-12-08 11:28:27
【问题描述】:

Chrome 等浏览器如何检查 SSL 证书?

有没有他们使用的在线数据库或网站?

浏览器会采取哪些步骤来验证 SSL 证书?

我可以不使用浏览器手动完成吗?

【问题讨论】:

  • 在什么情况下?如果您使用标准 SSL 库来建立连接,那么它已经为您完成了。

标签: validation security ssl cryptography public-key-encryption


【解决方案1】:

Chrome 等浏览器如何检查 SSL 证书?

证书和链是在 SSL 握手期间由服务器发送的。浏览器将根据证书颁发者、提供的链证书和本地根证书创建信任链。它将检查证书的到期和用途,并检查主题替代名称(可能还有主题),以确保证书实际上是为 URL 中的域颁发的。它还可能对证书吊销进行一些检查。

详情见SSL Certificate framework 101: How does the browser actually verify the validity of a given server certificate?How Do Browsers Handle Revoked SSL/TLS Certificates?

我有他们使用的任何在线数据库或网站吗?

不是真的。必要的信任库是本地的。他们可能会针对某些在线资源检查撤销。见Is Certificate validation done completely local?

我可以不使用浏览器手动完成吗?

当然,理论上可以手动复制浏览器所做的事情。例如,您可以访问该站点并使用openssl s_client -showcerts ... 获取叶证书和中间证书。然后您可以使用openssl verify 来验证证书链,另请参阅Verify a certificate chain using openssl verify。然后您需要查看带有openssl x509 -text ... 的叶子证书以检查用途、到期时间和主题。撤销很棘手,但可以在 openssl crlopenssl ocsp 的帮助下完成,尽管这并不能真正反映 what browsers do

【讨论】:

  • openssl verify 默认情况下不检查您链接的 Q 中未提及的撤销、“目的”(KU 和 EKU)或主机名。
  • @dave_thompson_085:感谢您的反馈。我稍微更改了顺序和措辞,以便更清楚地知道此链接仅显示链验证。我添加了有关如何检查吊销的信息。
【解决方案2】:

验证任何 SSL/TLS 证书的官方算法是 defined by PKIXmodified by OCSP。对于如今的 TLS,OCSP 令牌通常通过 TLS 握手中的“装订”而不是通过单独的连接来传输,这需要几个其他 RFC,但这只会影响传输,而不影响依赖者的实际验证。对于 HTTPS,客户​​端还必须检查服务器身份,即“主机名”为defined by rfc2818

实际上,浏览器可能会有所不同。 Chrome 主要使用谷歌确定的方案来“推送”他们选择的撤销数据,但这会不时改变。我上次听说的 Firefox 使用了他们自己的“one-CRL”方案。此外,虽然标准和传统做法是根据 SAN 检查主机名(如果存在),否则回退到 Subject.CN,但 Chrome 自几年前需要 SAN 并且从不使用 CN;你可以在几个堆栈上找到几十个关于“我的自签名或其他 DIY 证书不是来自真正的 CA 的证书停止在 Chrome 上工作”的问题。

如果您所说的“手动操作”真的是指手动操作,那将是很多的工作。如果您的意思是使用离线浏览器以外的工具,会更容易一些; OpenSSL(如果已安装)可以做到大部分,尽管您需要比 Steffen 的链接中显示的更多的选项才能做到这一点。

如果您的意思是使用浏览器以外的工具在线,绝对可以。近几十年来,万维网变得非常流行,有无数的程序和库可以访问它,几乎所有这些都包括 HTTPS(尽管在二十年前不太常见),其中包括验证证书——至少默认情况下是这样;许多人可以选择禁用、绕过或覆盖验证。有像curlwget 这样的独立工具——或者openssl s_client 可以在不使用HTTP 的情况下完成SSL/TLS 和证书部分。有无数的库和中间件,如 python 中的ssl(或使用它的requests)、nodejs 中的tls、Java 中的(旧)HttpsURLConnection 和(新)java.net.http 以及第三方,如 Apache HttpComponents;我确信 perl 和 dotnet 有对应物,尽管我不熟悉它们。还有powershell,在程序/库的区分上比较模糊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多