TLS 证书是什么?为什么我们需要证书透明度制度?

今天看了【二叉树树】为什么你的网站从没公开过还被打?其实是被扫SSL了!这个视频,视频中提到了 Certificate Search 这个网站,支持搜索一个域名的所有 TLS 证书。

这个网站正是利用了证书透明度(Certificate Transparency)这个机制,实现了搜索 TLS 证书的功能。正好有了思路,我想向大家介绍一下,证书是什么?证书透明度又是什么?为什么我们需要它?

证书是什么?

就像现实生活中您需要身份证来证明“您是你”一样,在网络上,一个网站需要证书来证明“它就是它,而不是一个冒牌的骗子”。

证书主要有两个作用:

  1. 验证身份:当你在浏览器地址栏输入 zrn.net 时,你的浏览器会检查服务器发来的证书。这个证书能证明对方确实是 zrn.net,而不是一个想窃取你信息的钓鱼网站。浏览器地址栏那个小锁头图标,就是告诉你“身份已验证,请放心”。
  2. 传输加密:一旦身份验证成功,这个证书里包含的“公钥”就会被用来建立一个加密通道。之后,你我之间互相发送的所有信息都会被加密后再发送出去,只有你和我能解密。这就像您和我之间建立了一条只有你我能懂的“暗语”通道。

TLS 证书为了实现这些功能,会存储许多信息,而并非简单的公钥私钥。

为什么不叫 SSL 而是 TLS?

如刚才的视频中,称呼为 SSL 证书,但我一直称呼它为 TLS 证书。

准确来说,其实叫它 TLS 证书也不是很准确。一个证书可以被用于 SSL,TLS,或者其他的加密协议。不过基于本文主题,我继续称呼它为 TLS 证书。

简单来说,TLS(Transport Layer Security, 传输层安全性协议)是 SSL(Secure Sockets Layer,安全套接层)的“继任者”和“升级版”。

你可以把它们想象成软件版本迭代的关系,比如 Windows 10 和 Windows 11。

SSL 由网景公司(Netscape)在1990年代发明,主要版本有 SSL 2.0 和 SSL 3.0。在 SSL 3.0 的基础上,互联网工程任务组(IETF)对其进行了标准化和升级,并将其更名为 TLS。

TLS 1.0 (1999年)在功能上与 SSL 3.0 非常相似,但有改进和增强。之后又陆续发布了 TLS 1.1、TLS 1.2 和目前最先进的 TLS 1.3。

所有的 SSL 版本(2.0,3.0)都已被证明存在严重的安全漏洞(例如 POODLE 攻击),现在已经被完全弃用。TLS 协议修复了这些漏洞,并引入了更强大、更安全的加密算法和验证机制。

目前,现代互联网上实际使用的加密协议是 TLS(通常是 TLS 1.2 或 1.3,比如本站只开启了 TLS 1.2 及以上版本)。任何还在使用 SSL 的网站都是不安全的。

CA 是干什么的?

刚才提到过,TLS 证书的一个作用就是验证身份。但是,你怎么知道服务器发给你的证书可信?

一个方法就是本地存储可信证书,但是网上的网站那么多,而且证书会过期,全部本地存储显然不现实。

为了解决这一系列问题,CA 扮演了一个“可信中间人”。CA 自己会有一个根证书,有效期非常长(几十年),并且 CA 数量少很多,这使得本地存储可信的 CA 证书成为可能。

CA 负责给别的网站签发证书。这个过程形成了一条“信任链”:你的浏览器/操作系统内置了一批“根证书”,这些是顶级 CA 的证书,被无条件信任。当浏览器收到 zrn.net 的证书时,它会检查:签发 zrn.net 证书的 CA 是否是可信的?如果这个 CA 不是根 CA,那么浏览器会继续往上查找,看签发这个 CA 证书的上一级 CA 是否可信,直到找到一个内置的根证书为止。

简单来说,TLS 证书的信任,最终都追溯到了你的设备里预装的那一小批根证书上。因此,可以说 TLS 证书证明了网站的可信度,而 CA 体系则证明了这张 TLS 证书本身的可信度。

新的问题

实际情况中,可能出现另一个问题:当初可信的 TLS 证书,可能变得不可信。比如黑客黑入服务器,盗取了证书。这是,网站所有者需要向 CA 申请撤销证书。

但这引出了一个新问题:如果证书的私钥被盗,或者网站所有者不再需要它,怎么才能让这张还在有效期内的证书失效呢?

为了解决这个问题,诞生了 OCSP(Online Certificate Status Protocol,在线证书状态协议)。客户端在验证 TLS 证书后,会额外向 CA 的 OCSP 服务器发送一个查询请求,确认这张证书是否已被吊销。

然而,OCSP 机制本身也存在一些问题,比如可能带来额外的延迟,或者在查询失败时,浏览器为了不影响用户体验可能会选择“软失败”,即暂时相信证书是有效的,这留下了安全隐患。

更重要的是,OCSP 只能解决“已被发现”的问题,它无法解决我们即将要讨论的一个更深层次的信任危机:如果 CA 本身就“监守自盗”,在域名所有者完全不知情的情况下,胡乱签发了证书呢?

证书透明度

证书透明度则解决了另一个问题:确保 CA 可信。

我们发现,在上面的流程中,我们一定需要一个绝对可信的中间人,帮助我们完成信任过程。但如果 CA 不可信呢?CA 自己乱签发证书呢?这些情况在历史中真实发生过:

证书透明度是一项旨在增强整个互联网安全、由 Google 倡导并被行业广泛采用的公开监督机制。

你可以把证书透明度想象成一个全球公开、不可篡改的“证书签发公告板”或“公共账本”。它的主要目标是解决过去 SSL/TLS 体系中的一个重大缺陷:证书颁发机构(CA)可能会错误地、甚至恶意地签发证书,而域名所有者和公众对此毫不知情。

整个机制主要由以下三个部分协同工作:

  1. 强制日志记录
    • 现在,所有信誉良好的证书颁发机构(CA)都被强制要求,在签发任何公开信任的 SSL/TLS 证书时,必须将该证书(或其“预证书”)提交到一个或多个公开的、独立的“CT 日志服务器”中。
  2. 公开可审计的日志
    • 这些 CT 日志服务器是完全公开的,任何人都可以查看和审计。它们由不同的组织(如 Google,Cloudflare,DigiCert 等)运营,并且具有密码学保障,只能追加记录,无法被篡改或删除。
    • 这意味着,任何一张被签发的证书,都会留下一个永久的、公开的、可被查验的记录。
  3. 浏览器强制执行
    • 这是最关键的一环。像 Chrome、Safari 这样的主流浏览器,现在会强制检查一个网站的证书是否包含了“已登录到 CT 日志”的证明,这个证明被称为签名的证书时间戳(Signed Certificate Timestamp)。
    • 如果一个证书没有附带有效的 SCT(Signed Certificate Timestamp,签名证书时间戳),浏览器就会认为它不可信,并向用户发出安全警告。这个 SCT 就好比是 CA 将证书存入“公共账本”后,日志服务器返回的一个“盖了章的回执”。证书必须带上这个“回执”,浏览器才承认它的合法性。
    • 这就形成了一个完美的闭环:CA 为了让自己的证书被浏览器信任,就必须把证书信息公开到 CT 日志里。而一旦公开,任何人(特别是域名所有者自己)都可以去查阅,从而确保 CA 不敢胡作非为。

现在,我们可以回到文章开头的那个问题了:为什么一个从未公开过的网站,也会被人用扫描器发现?

答案正是我们探讨的核心——证书透明度。

你在视频中看到的 crt.sh 网站,正是利用了这个全球公开的“证书账本”来提供查询服务。这种“被动公开”看似是一个小麻烦,但实际上,它是我们为了获得整个互联网生态安全所做出的一个至关重要的权衡。

从最初简单地信任 CA,到后来用 OCSP 查询吊销状态,再到今天用 CT 机制来监督 CA 本身,我们看到网络世界的信任体系在不断进化。它不再是单向、盲目的授予,而是演变成了一种公开、可验证、多方共同监督的透明化信任。

下一次,当你看到浏览器地址栏那个小小的锁头时,你不仅知道它代表着加密和身份验证,更可以了解到其背后,有一个由无数工程师和组织共同构建的宏大系统在默默守护。而这,正是技术带给我们最坚实的安全感。