【发布时间】:2020-12-08 11:28:27
【问题描述】:
Chrome 等浏览器如何检查 SSL 证书?
有没有他们使用的在线数据库或网站?
浏览器会采取哪些步骤来验证 SSL 证书?
我可以不使用浏览器手动完成吗?
【问题讨论】:
-
在什么情况下?如果您使用标准 SSL 库来建立连接,那么它已经为您完成了。
标签: validation security ssl cryptography public-key-encryption
Chrome 等浏览器如何检查 SSL 证书?
有没有他们使用的在线数据库或网站?
浏览器会采取哪些步骤来验证 SSL 证书?
我可以不使用浏览器手动完成吗?
【问题讨论】:
标签: validation security ssl cryptography public-key-encryption
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 crl 和 openssl ocsp 的帮助下完成,尽管这并不能真正反映 what browsers do。
【讨论】:
openssl verify 默认情况下不检查您链接的 Q 中未提及的撤销、“目的”(KU 和 EKU)或主机名。
验证任何 SSL/TLS 证书的官方算法是 defined by PKIX 和 modified 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(尽管在二十年前不太常见),其中包括验证证书——至少默认情况下是这样;许多人可以选择禁用、绕过或覆盖验证。有像curl 和wget 这样的独立工具——或者openssl s_client 可以在不使用HTTP 的情况下完成SSL/TLS 和证书部分。有无数的库和中间件,如 python 中的ssl(或使用它的requests)、nodejs 中的tls、Java 中的(旧)HttpsURLConnection 和(新)java.net.http 以及第三方,如 Apache HttpComponents;我确信 perl 和 dotnet 有对应物,尽管我不熟悉它们。还有powershell,在程序/库的区分上比较模糊。
【讨论】: