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 验证失败
- 确认解析已生效(
dig结果是你的服务器 IP); - 确认 80 端口对外可通(安全组 + 防火墙双放行);
- 确认 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 突然红色警告,一查证书已过期一周,自动续签是开着的。
排查过程:
- 证书列表点【申请】手动续签,日志报 DNS 相关错误,指向 DNS 账户。
- 检查 DNS 账户,发现服务商的 API Secret 半年前换过一次,面板里还是旧的。
- 更新凭证后手动申请,仍报错——TXT 记录冲突,之前手动加过同名校验记录没删。
修复:删掉残留的 TXT 记录,重新申请成功;随后从外部验证新证书已生效。
# 续签后从外部确认证书有效期(在本地机器执行)
curl -vI https://你的域名/ 2>&1 | grep -E "subject|expire"
复盘要点:凭证变更和残留记录是续签失败的两大隐形杀手。域名服务商换 Key 之后,一定要同步更新 1Panel 里的 DNS 账户。另外这个案例也说明,“自动续签开着”不等于“续签一定能成功”——它依赖的东西变了,开关救不了你。
怎么早点发现证书要过期
不要等浏览器报警告。两个低成本做法:
- 定期看证书列表——列表会显示到期时间,快到期的排前看;
- 用计划任务做监控——建一个“访问 URL”类型的计划任务,周期性请求自己的 HTTPS 网站;或者干脆建一个 Shell 脚本任务检查证书天数并告警(告警能力取决于许可证,以面板功能为准)。
本节要点
- 证书失败先看证书日志的报错原文,再决定查解析、查端口还是查凭证;
dig查解析、外部curl查端口通路,是两个最基本的验证动作;- 自动续签只对 DNS 账户/HTTP 验证申请的证书有效,手动证书得自己记着换;
- 续签成功后,有 CDN/负载均衡的还要同步更新入口的证书;
- ACME 账户支持的机构有 Let's Encrypt、ZeroSSL、Buypass、Google Cloud 及自定义 ACME 服务。
证书申请的完整操作步骤见 1Panel 官方文档:证书 中“申请证书”一节,以官方文档为准。
下一节:证书正常、网站也能开,但伪静态不生效、接口跨域被拦、某些目录死活访问不了——收尾四个小而缠人的问题。
