我应该采取哪些步骤来像浏览器一样手动验证SSL证书?

What steps should I take to validate a SSL Certificate manually as browsers do?

提问人:Rezaeimh7 提问时间:8/19/2020 最后编辑:Rezaeimh7 更新时间:11/16/2023 访问量:3522

问:

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

他们是否有任何在线数据库或网站?

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

我可以在不使用浏览器的情况下手动完成吗?

验证 安全 SSL 公钥加密

评论

0赞 user207421 8/19/2020
在什么情况下?如果您使用标准 SSL 库来建立连接,则已经为您完成了连接。

答:

4赞 Steffen Ullrich 8/19/2020 #1

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

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

有关详细信息,请参阅SSL证书框架101:浏览器如何实际验证给定服务器证书的有效性?和浏览器如何处理吊销的SSL/TLS证书?

他们是否有任何在线数据库或网站?

没有。必要的信任存储是本地的。他们可能会根据某些在线资源检查吊销。请参阅证书验证是否完全在本地完成?

我可以在不使用浏览器的情况下手动完成吗?

当然,从理论上讲,浏览器所做的事情可以手动复制。例如,您可以访问该站点并使用 获取叶证书和中间证书。然后,您可以使用来验证证书链,另请参阅使用 openssl verify 验证证书链。然后,您需要查看叶子证书,以检查目的,有效期和主题。吊销是很棘手的,但可以在 openssl crlopenssl ocsp 的帮助下完成,尽管这并不能真正反映浏览器的作用openssl s_client -showcerts ...openssl verifyopenssl x509 -text ...

评论

0赞 dave_thompson_085 8/19/2020
openssl verify默认情况下,不会检查吊销、“目的”(KU 和 EKU)或主机名,这些在 Q you 链接中未提及。
0赞 Steffen Ullrich 8/19/2020
@dave_thompson_085:感谢您的反馈。我稍微更改了顺序和措辞,以便更清楚地看到此链接仅显示链验证。我添加了有关如何检查吊销的信息。
1赞 dave_thompson_085 8/19/2020 #2

用于验证任何SSL / TLS证书的官方算法由PKIX定义并由OCSP修改。对于现在的 TLS,OCSP 令牌通常通过 TLS 握手中的“装订”而不是通过单独的连接进行传输,这需要其他几个 RFC,但这只会影响传输,而不会影响依赖者的实际验证。具体到 HTTPS,客户端还必须检查 rfc2818 定义的服务器标识(又名“主机名”)。

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

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

如果您的意思是使用在线浏览器以外的工具,那绝对是。近几十年来,WWW 变得非常流行,有数以百万计的程序和库可以访问它,几乎所有程序和库都包括 HTTPS(尽管在二十年前还不太常见),其中包括验证证书——至少在默认情况下是这样;许多选项具有禁用、绕过或覆盖验证的选项。有一些独立的工具,如和 -- 或者可以做 SSL/TLS 和证书部分,而无需在上面做 HTTP。有无数的库和中间件,如 python(或使用它)、nodejs、Java 中的(旧)和(新)以及 Apache 等第三方;我敢肯定 perl 和 dotnet 有对应的对应物,尽管我不熟悉它们。以及 powershell,它在程序/库的区别上是模糊的。curlwgetopenssl s_clientsslrequeststlsHttpsURLConnectionjava.net.httpHttpComponents