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

问题描述

Chrome之类的浏览器如何检查SSL证书?

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

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

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

解决方法

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

,

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

实际上,浏览器可能有所不同。 Chrome浏览器大多使用Google确定的方案来“推送”他们选择的吊销数据,但是这种情况不时发生变化。上次听说,Firefox使用了自己的“ one-CRL”方案。另外,尽管标准和传统做法是根据SAN检查主机名(如果存在),否则回落到Subject.CN,但自几年前Chrome开始需要且从不使用CN;您会在几个堆栈中找到许多关于“我的自签名证书或其他不是来自真正CA的DIY证书停止在Chrome上运行”的问题。

如果“手动完成”实际上是指手动,那么这将是很多工作。如果您的意思是使用脱机浏览器以外的工具,则会稍微容易一些; OpenSSL(如果已安装)最多可以做到这一点,尽管您需要的功能比Steffen链接中所示的更多,才能正确使用。

如果您的意思是使用浏览器 online 以外的工具,则绝对可以。在最近的几十年中,WWW变得非常流行,并且有无数的程序和库可以访问它,几乎所有程序和库都包括HTTPS(尽管在20年前这种情况并不常见),其中包括验证证书(至少默认情况下是这样) ;许多都具有禁用,绕过或覆盖验证的选项。有curlwget之类的独立工具-或openssl s_client可以执行SSL / TLS和证书部分,而无需首先执行HTTP。有无数的库和中间件,例如python中的ssl(或使用它的requests),nodejs中的tls,(较旧的)HttpsURLConnection和(较新的)java.net.http Java以及Apache HttpComponents之类的第三方;尽管我不熟悉perl和dotnet,但我肯定还有。以及Powershell,这在程序/库的区分上是模糊的。