浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么

很多人把“证书签发”和“建立加密连接”当成一回事,也把 CT 日志误认成证书的一部分。这篇拆解 HTTPS 首访背后四件独立的事:域名控制权验证、CA 签发、TLS 握手、公网透明度检查,帮你定位问题到底出在哪一环。

本文目录
浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么

排查 HTTPS 问题时,最常见的混乱是把四件完全不同的事揉成一团:“证书不是签发了吗,为什么浏览器还报警?”——因为签发只是四步里的一步,浏览器还另外干了自己的活。把它们拆开看,很多报错立刻就有方向了。

域名验证:CA 先确认你是你

在签发任何证书之前,CA 必须先确认申请者控制着证书上要写的那个域名。这就是 ACME 协议里的 challenge,常见两种:

  • HTTP-01:CA 访问 http://域名/.well-known/acme-challenge/...,看你能不能在这个路径下放指定内容。简单,但要求 80 端口可达。
  • DNS-01:CA 查 _acme-challenge.域名 的 TXT 记录。适合 80 端口被占用、内网环境,也是申请泛域名证书的唯一方式。

这一步不产生任何加密,纯粹是身份核验。验证过了,CA 才相信把 example.com 写进证书不会替别人发证。

浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么:a concrete operational scene explaining this section: 域名验证:CA 先确认你是你
浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么:a concrete operational scene explaining this section: 域名验证:CA 先确认你是你查看原图

证书签发:CA 签字盖章

验证通过后,CA 用你的公钥生成证书,用自己的私钥签名,交还给你。这一步的核心产物是那串数字签名——浏览器将来靠它确认“这张证书确实是某个我信任的 CA 发的”。

这里有个容易忽略的点:签发成功只代表“文件拿到了”。证书躺在磁盘上,不等于网站已经加密。它更像护照办下来了,但你还没拿着它去任何口岸。

TLS 握手:浏览器真正干活的地方

用户第一次访问你的 HTTPS 站点时,浏览器和服务器做 TLS 握手。这中间浏览器会独立地做几项检查,和签发环节无关:

  1. 链式校验:服务器出示的证书,签名链能不能走到浏览器内置的某个根 CA。
  2. 域名匹配:证书上的 SAN 是否包含当前访问的域名。证书签给 www.a.com,你拿去配 api.a.com,照样报错。
  3. 有效期:当前时间是否落在 Not Before / Not After 之间。
  4. 协商密钥:双方协商出本次会话的对称加密密钥,之后的 HTTP 流量用它加密。
浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么:a concrete operational scene explaining this section: 证书签发:CA 签字盖章
浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么:a concrete operational scene explaining this section: 证书签发:CA 签字盖章查看原图

“加密连接”只发生在这一步。证书本身不加密任何东西,它只是握手时出示的身份证件。所以“证书过期”和“连接被重置”是两码事:前者是握手校验失败,后者可能证书根本没机会出场,比如防火墙直接掐了 443。

公网检查:CT 日志在盯着 CA

还有第四件事,发生在 CA 侧,很多运维完全不知道它的存在:证书透明度(Certificate Transparency)。

主流浏览器要求公开信任的 CA 把签发的每张证书提交到公开、只增不改的 CT 日志里。证书里会带上 SCT(签名证书时间戳),握手时浏览器会检查它。目的不是保护你,而是监督 CA——任何人都能查日志,发现某 CA 背着你给 你的域名.com 签了证书。

一个实用的副作用:你可以去 crt.sh 之类的地方查自己域名的所有历史签发记录。子域名被人申请了奇怪证书、测试环境证书暴露了内部命名,都能在这儿看到。CT 日志是防 CA 作恶的摄像头,顺带也能帮你看清自己家底。

浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么:a concrete operational scene explaining this section: TLS 握手:浏览器真正干活的地方
浏览器第一次访问 HTTPS 时,域名验证、签发、握手和 CT 日志到底各管什么:a concrete operational scene explaining this section: TLS 握手:浏览器真正干活的地方查看原图

四步的边界,记一张表

| 环节 | 谁在做 | 出问题时的典型现象 | |---|---|---| | 域名验证 | ACME 客户端 ↔ CA | 签发直接失败,challenge 超时 | | 证书签发 | CA | 拿不到证书文件 | | TLS 握手校验 | 浏览器 | 证书链错误、域名不匹配、过期告警 | | CT 检查 | 浏览器查日志 | 证书有效但仍被拒(少见,多见于私有 CA 误用) |

在 CertbotX 中实践

这四步里,前两步可以自动化掉。CertbotX 走 ACME 协议完成域名验证和签发,支持 DNS-01 的 CNAME 委托——把 _acme-challenge 记录指到专门的验证域名,就不用给主域名的 DNS 开修改权限。签发完成后可以自动部署到 Agent、EdgeOne 或 CDN,并在到期前重新签发,部署动作留有记录可查。这样你日常需要操心的就只剩握手那一层:证书链有没有配全、域名有没有漏进 SAN。

延伸阅读

← 返回资讯中心