你在 Vercel / Firebase / Netlify 绑了自定义域名。控制台显示 “SSL certificate pending”,或者 HTTP 能正常打开但 HTTPS 报 NET::ERR_CERT_AUTHORITY_INVALID。30 分钟过去了,1 小时过去了。Let’s Encrypt(多数平台用)发证需要两个条件成功:(1) DNS 指向平台;(2) 平台成功完成 HTTP-01 或 DNS-01 challenge。绝大多数卡住的 SSL 案例都是其中一项静默失败——DNS 没完全传播、CAA 记录挡了 CA、或者 CDN/代理截了 challenge。
常见原因
按命中率从高到低。
1. DNS 还没传播
平台的发证器要拉 https://yourdomain.com/.well-known/acme-challenge/...。DNS 还没到发证器的 resolver,challenge 就失败。
怎么判断:
dig yourdomain.com +short
还没显示平台的 IP/CNAME 就是 DNS 没传播。
2. CAA 记录挡了 Let’s Encrypt
DNS 有 CAA 记录如 0 issue "digicert.com",就只有 DigiCert 能发。Let’s Encrypt 请求被拒。
怎么判断:
dig CAA yourdomain.com
看到 CAA 记录且没有允许 letsencrypt.org 就是这条。
3. Cloudflare 代理(橙云)截了 challenge
Cloudflare 代理 DNS 时,平台无法触达源站验证 HTTP-01 challenge。Challenge token 返回的是 Cloudflare 的响应、不是你的平台的,就失败。
怎么判断:Cloudflare DNS 里,apex 域名的 A/CNAME 是橙云(代理中)。初次发证必须关掉。
4. 记录类型跟平台要求不匹配
Vercel apex:A 记录。www:CNAME。Firebase 类似。要求 A 但你设了 CNAME,发证就完不成。
怎么判断:对照平台文档看记录类型。Vercel:apex 必须是 A 76.76.21.21;www 必须是 CNAME cname.vercel-dns.com。
5. 平台还没验证域名所有权
某些平台要求显式所有权验证(TXT 记录)才发 SSL。加了域名但跳过了验证,控制台就一直 “pending”。
怎么判断:平台控制台里找 “Verify ownership” 或 “Domain not verified” 提示。
6. AAAA 记录指向别处
A 记录指对了但 AAAA(IPv6)指向旧主机。发证器可能偏好 IPv6 打到错的目标。
怎么判断:
dig AAAA yourdomain.com
有 AAAA 指向别处就删或更新。
7. 浏览器的 HSTS preload
浏览器看到旧的 HSTS preload 条目,连临时回退到 HTTP 都拒绝。不直接影响发证,但掩盖了真实状态。
怎么判断:证书发完了浏览器还报 NET::ERR_CERT_AUTHORITY_INVALID。在浏览器里清这个域名的 HSTS。
最短修复路径
第 1 步:用 dig 验证 DNS
dig yourdomain.com +short # A 记录
dig CNAME www.yourdomain.com +short # www 的 CNAME
都应返回平台期望的值。还显示旧主机 IP 就是 DNS 没完全到位。
第 2 步:查 CAA
dig CAA yourdomain.com
看到限制性的 0 issue "digicert.com" 这种,要么加 0 issue "letsencrypt.org"、要么删除 CAA 记录(默认”任何 CA 都能发”)。
第 3 步:临时关 Cloudflare 代理
Cloudflare DNS → 根域和 www → 点橙云图标 → 变灰(DNS only)。等 1-2 分钟。在平台控制台重新触发发证。
证书发出后可以重新开代理(橙云)。续签用的是另一套机制,能穿过 Cloudflare。
第 4 步:记录类型严格匹配平台文档
Vercel apex:A 76.76.21.21。Vercel www:CNAME cname.vercel-dns.com。不要给 apex 用 CNAME(DNS 规范上根域名不允许)。
Netlify、Firebase 等严格按它们文档来。别即兴。
第 5 步:重新触发发证
修完 DNS / CAA / 代理后:
- Vercel:Domain settings → 点 “Refresh”,或者删了重加域名。
- Netlify:Domain management → “Verify DNS configuration” → “Provision certificate”。
- Firebase:Hosting → Domains → 等状态更新(没有手动按钮)。
第 6 步:等 15 分钟到 1 小时
多数平台每 5-15 分钟重试一次发证。不要反复删了重加——会重置队列位置。
第 7 步:仍卡住就找平台支持
DNS 正确、CAA 清、代理关后 4+ 小时仍 pending,提工单。附:
- 域名
- DNS dig 输出
- CAA dig 输出
- 添加域名的时间戳
预防建议
- 没特别理由不要设 CAA;设了就把平台可能用的所有 CA 都包含(Let’s Encrypt、Sectigo 等)。
- 初次发证前不要开 Cloudflare 代理。
- 看平台控制台前先 dig 验证 DNS——DNS 不对,证书发不出。
- 记录类型严格按平台文档来,不要用 CNAME 替 A。
- 给新域名维护一份
domain-setup.mdrunbook,写明你平台的精确步骤。