ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Caddy 中间证书过期 HTTPS 报错排查:3 个方案从救急到根治

Caddy 中间证书过期 HTTPS 报错排查:3 个方案从救急到根治 Caddy 中间证书过期 HTTPS 报错排查3 个方案从救急到根治【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy线上 Caddy 站点突然弹出您的连接不是私密连接openssl一看叶子证书明明还有 80 天有效期服务却就是发不了正常的 HTTPS 请求。问题不在证书本身而在证书链里那张不起眼的中间证书——CA 签发的介绍信到期了。下面按确诊 → 病因 → 分级修复的路径走一遍全部命令和参数都取自 Caddy 仓库可查的实现。一条命令确诊证书链里哪张证书到期了先用下面这条命令连上你的站点把服务器实际吐出来的证书链导出来再查每张证书的到期天数-days负数就是已过期# 导出 Caddy 对外提供的前两张证书0叶子, 1中间证书查过期剩余天数 openssl s_client -connect 你的域名:443 -showcerts 2/dev/null \ | openssl x509 -noout -days -checkend 0 -nameopt multiline结果判读分两种中间证书第 2 张天数是负数而叶子证书还有几十天 → 确诊中间证书过期就是本文要解决的问题叶子证书本身就是负数或者输出里unable to get local issuer certificate但各证书日期都正常 → 是证书缺失/不匹配的问题别走本文路线先检查tls指令指向的文件和域名是否对得上。为什么会这样三张介绍信的链条把证书链想成一串介绍信浏览器查你的服务器服务器出示身份证叶子证书但身份证得由派出所中间证书盖的章才算数派出所还得有公安厅根证书的授权。浏览器手里只预置了根证书中间那张就是缺的那一环。链条上任何一张过期、缺章或没被出示验证都直接失败——哪怕你的身份证还在有效期内。Caddy 默认通过 ACME 协议自动申请证书正常情况下续签时会顺带拿到 CA 当前有效的中间证书基本无感。所以这个故障基本只出现在两种情况你手动写了tls 证书.crt 密钥.key静态链文件里的中间证书过期了证书是多年前签的、一直复用而 CA 提前退役了旧中间证书。具体哪张证书什么时候失效可以拿openssl x509 -enddate -noout对链文件逐张确认。方案 A救急——重签一次证书约 5 分钟先恢复服务删掉静态证书配置让 Caddy 走 ACME 重新申请CA 会把新的中间证书和叶子证书一起发下来。前提是你的域名能解析到这台机器且 80、443 端口可达。# Caddyfile注释掉原来的静态证书行恢复自动管理 example.com { tls internal # 对外域名用 ACME删掉本行即可内网域名用 internal root * /var/www/html file_server }改完执行caddy reload --config Caddyfilereload 会零中断热加载新配置再用确诊那条openssl s_client命令复核链里每张证书-days都应为正数。方案 B彻底修复——把证书交回 Caddy 自动管理救急之后别手动维护文件了。Caddy 的 TLS 模块默认每 10 分钟扫描一次所有受管证书的到期时间见 modules/caddytls/automation.go到期前按证书总寿命的约 1/3 提前续签续签成功自动热切换中间证书跟着一起换新。如果你确实需要调整扫描频率全局选项renew_interval是真实存在的配置项默认 10m{ renew_interval 10m }注意别去写auto_https interval 72h这种组合——auto_https只接受off、disable_redirects、disable_certs、ignore_loaded_certs带 interval 会直接报错。另外storage_clean_interval默认 24h控制多久清理一次存储里的过期资产一般不用动。证书和密钥默认存在/var/lib/caddy备份这个目录即可。验证生效看 Caddy 日志出现obtaining certificate字样或再跑一次确诊命令确认链已更新。方案 C长期预防——30 天到期预警自动管理不等于不用管加一道独立探测最稳。下面脚本每天跑一次crontab 里放0 3 * * * /opt/check_chain.sh链上任何一张证书剩余不足 30 天就把域名、剩余天数写进告警日志可接邮件或 IM 推送# /opt/check_chain.sh检测整条证书链最短剩余天数 30 天则告警 certs$(openssl s_client -connect 你的域名:443 -showcerts 2/dev/null \ | sed -n /BEGIN CERTIFICATE/,/END CERTIFICATE/p) min9999 while read -rd c 3; do d$(echo $c | openssl x509 -noout -checkend 0 -days 2/dev/null \ | openssl x509 -noout -days 2/dev/null) # 逐张算剩余天数 [ -n $d ] [ $d -lt $min ] min$d done 3$(echo $certs | awk BEGIN{RS-----END CERTIFICATE-----})$(echo) [ $min -lt 30 ] logger -t certwarn 你的域名 证书链最短剩余 ${min} 天验证生效手动跑一次脚本正常情况下无输出、echo $?为 0可以临时把阈值改大到 9999 观察告警分支是否按预期触发。常见误区只看叶子证书就下结论浏览器报连接不安全时链上三张证书任何一张过期都会挂必须逐张看。改了 Caddyfile 不 reload配置文件只是模板caddy reload之后才生效改完不执行等于没改。以为自动管理就能彻底不管Caddy 只在续签成功后换新链。如果 80/443 被防火墙挡住、DNS 不解析续签会静默失败旧链到期照样挂。手动给的链文件顺序错了tls指令里链文件要叶子在前、根在后少了中间证书就会出现unable to get local issuer certificate。给内网域名申请 ACME 证书内网域名用不了 ACME应写tls internal由 Caddy 内置 CA 签发链天然自洽。收尾检查清单用openssl s_client确认链上每张证书剩余天数为正Caddyfile 里没有手写的tls 证书 密钥除非证书确实由外部系统维护并定期轮换80、443 端口对 CA 可回拨DNS 解析正确/var/lib/caddy存储目录已纳入定期备份到期预警脚本跑通且告警通道真实收到过一条测试消息链上每一环都在线浏览器就不再拦路。【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表