2.3 域名解析与 SSL 证书签发、续签失败

先给一个判断

证书申请失败,90% 不是证书模块的问题,而是它依赖的三件事之一坏了:域名解析、验证通路、API 凭证。 1Panel 的证书功能只是把 Let's Encrypt 这类 ACME 机构的签发流程做成了界面,真正决定成败的是解析有没有指对、80 或 DNS API 有没有通。所以报错之后先干一件事:展开证书日志看报错原文,里面会明确说是哪一步失败的。

前置知识:三种验证方式

申请证书前,先搞清楚自己用的是哪种验证,排查方向完全不同:

验证方式 原理 依赖什么 典型失败原因
HTTP 验证 机构访问你域名的 80 端口验证 解析指向 + 80 端口可达 80 没放行、解析没生效、被墙
DNS 账户验证 调 DNS 服务商 API 自动加解析记录 DNS 账号的 API 凭证 凭证过期、权限不足
手动解析 自己去 DNS 后台加 TXT 记录 手工操作 记录加错、没等生效

选择建议:域名在阿里云、腾讯云、Cloudflare 这些支持 API 的服务商,直接用 DNS 账户验证,最省心;解析在别人手里、改不了 API 的,才用 HTTP 或手动解析。泛域名必须走 DNS 验证,HTTP 验证搞不了泛域名。

现象与原因对照表

现象 可能原因 第一步动作
申请直接报错 ACME 账户或 DNS 账户问题 看证书日志报错原文
卡在“等待验证” 解析没生效 / 80 不通 先 dig 查解析
续签失败 原来的解析或凭证变了 对比域名现在的解析
浏览器红色警告 证书早过期了没发现 先续签,再排查为什么没自动续
手动上传证书后不生效 网站没重新加载证书 网站配置里重新选证书

定位:证书申请失败的标准流程

第一步:看日志。 证书列表里有日志入口,任务日志也能看到申请过程。报错原文决定下一步:

报错关键信息 指向
DNS 相关错误 DNS 账户凭证 / 服务商 API
超时 / 连接拒绝 80 端口或网络
域名不匹配、未找到解析 域名解析本身
账户相关 ACME 账户

第二步:查解析。 这一步很多人跳过,但它是基础:

# 查 A 记录指向(Linux 通用)
dig 你的域名 +short
# 或者
nslookup 你的域名

# 查 TXT 记录(手动验证时确认自己加的记录生效没)
dig _acme-challenge.你的域名 TXT +short

解析没指向你这台服务器,后面全是白忙。

第三步:查 80 端口。 HTTP 验证要求机构能访问到你的 80 端口:

# 服务器本地确认 80 在监听
ss -ltnp | grep ':80 '

# 从外部测试(在别的机器上执行)
curl -I http://你的域名/

注意:云服务商的安全组和服务器防火墙都要放行 80,缺一个都验证失败。很多新手服务器防火墙放行了,安全组忘了开。

修复:按场景走

场景一:DNS 账户验证失败

核对清单:API 凭证(Key/Secret/Token)对不对、有没有过期、账号有没有域名的管理权限。凭证去各家服务商的 API 文档里获取——这个官方文档也帮不上忙,得查服务商的说明。

常见错误:子域名的解析在父域名账号下,或者用了服务商的子账号但没给 DNS 权限。

场景二:HTTP 验证失败

  1. 确认解析已生效(dig 结果是你的服务器 IP);
  2. 确认 80 端口对外可通(安全组 + 防火墙双放行);
  3. 确认 OpenResty 正常运行。

一个隐蔽的坑:网站配了“禁止 HTTP 访问”或强制跳转 HTTPS,可能影响 HTTP 验证通路。具体验证行为以证书模块的日志为准。

场景三:自动续签没触发或失败

官方文档写得很清楚:通过 DNS 账户或 HTTP 验证申请的证书才能自动续签;手动 DNS 验证和手动上传的证书不能。先去证书列表确认那个证书的自动续签开关是什么状态。

续签失败的常见原因(官方原文列举过):域名解析、API 凭证、网络或网站配置变化。 很多人的网站一开始是 DNS 账户验证签的,后来域名服务商换号了、API 凭证删了,续签就一直失败,而网页还能用 HTTP 打开,直到某天浏览器突然红色警告才发现。

处理:点证书行的【申请】手动触发一次续签,看日志定位;修好依赖后确认自动续签开关为开。

场景四:CDN / 负载均衡场景

官方提醒:业务侧有 CDN、负载均衡或外部代理时,续签成功后还要同步更新对应入口的证书。1Panel 签发了新证书,但用户实际访问的是 CDN 节点,CDN 上还挂着旧证书,浏览器照旧报警告。续签成功 ≠ 用户看到新证书。

场景五:多域名、子网站和泛域名

一个网站可以绑主域名和其他域名,但证书覆盖哪些域名,是申请时决定的。常见翻车现场:

  • 网站绑了 a.com 和 www.a.com,证书只签了 a.com,访问 www 就报警告;
  • 子网站复用了父网站的目录,但用了新域名,新域名没有自己的证书;
  • 泛域名证书只覆盖 *.a.com,不覆盖 a.com 本身(这是一条规则,不是 bug)。

处理:证书申请时把所有要用的域名都列进去;网站配置 → HTTPS 里重新选择覆盖完整的证书;不确定时在浏览器点开证书详情看“主体备用名称”列表,一目了然。

怎么验证解析和端口都通了

申请之前先做一遍自检,能少走九成弯路:

# 1. 解析指向对不对(结果应该是你的服务器公网 IP)
dig 你的域名 +short

# 2. 本机 80/443 在不在
ss -ltnp | grep -E ':80 |:443 '

# 3. 从外部能不能访问(在别的机器上执行)
curl -I http://你的域名/
curl -I https://你的域名/

# 4. 手动验证 TXT 记录生效没有
dig _acme-challenge.你的域名 TXT +short

第 3 步如果你没有“别的机器”,可以用手机断开 WiFi 用 4G 测,或者找个在线的端口检测工具。注意:能 ping 通域名不代表 80 端口通,ping 走的是 ICMP,跟 HTTP 完全两回事。

一个完整的复现与修复

现象:网站 HTTPS 突然红色警告,一查证书已过期一周,自动续签是开着的。

排查过程:

  1. 证书列表点【申请】手动续签,日志报 DNS 相关错误,指向 DNS 账户。
  2. 检查 DNS 账户,发现服务商的 API Secret 半年前换过一次,面板里还是旧的。
  3. 更新凭证后手动申请,仍报错——TXT 记录冲突,之前手动加过同名校验记录没删。

修复:删掉残留的 TXT 记录,重新申请成功;随后从外部验证新证书已生效。

# 续签后从外部确认证书有效期(在本地机器执行)
curl -vI https://你的域名/ 2>&1 | grep -E "subject|expire"

复盘要点:凭证变更和残留记录是续签失败的两大隐形杀手。域名服务商换 Key 之后,一定要同步更新 1Panel 里的 DNS 账户。另外这个案例也说明,“自动续签开着”不等于“续签一定能成功”——它依赖的东西变了,开关救不了你。

怎么早点发现证书要过期

不要等浏览器报警告。两个低成本做法:

  1. 定期看证书列表——列表会显示到期时间,快到期的排前看;
  2. 用计划任务做监控——建一个“访问 URL”类型的计划任务,周期性请求自己的 HTTPS 网站;或者干脆建一个 Shell 脚本任务检查证书天数并告警(告警能力取决于许可证,以面板功能为准)。

本节要点

  • 证书失败先看证书日志的报错原文,再决定查解析、查端口还是查凭证;
  • dig 查解析、外部 curl 查端口通路,是两个最基本的验证动作;
  • 自动续签只对 DNS 账户/HTTP 验证申请的证书有效,手动证书得自己记着换;
  • 续签成功后,有 CDN/负载均衡的还要同步更新入口的证书;
  • ACME 账户支持的机构有 Let's Encrypt、ZeroSSL、Buypass、Google Cloud 及自定义 ACME 服务。

证书申请的完整操作步骤见 1Panel 官方文档:证书 中“申请证书”一节,以官方文档为准。

下一节:证书正常、网站也能开,但伪静态不生效、接口跨域被拦、某些目录死活访问不了——收尾四个小而缠人的问题。