Caddy 自动 HTTPS 是怎么工作的
它替你做了什么
Caddy 里写一个域名块:
example.com {
root * /var/www/site
file_server
}
启动时会自动:向 ACME 服务(默认 Let's Encrypt)申请证书 → 完成域名验证 → 落盘 → 到期前自动续期 → 把 HTTP 请求 301 到 HTTPS。全程不需要你写 certbot 的 cron。
两种域名验证方式
| 方式 | 依赖 | 说明 |
|---|---|---|
| HTTP-01 | 80 端口可从公网访问 | Caddy 在 /.well-known/acme-challenge/ 下放一个文件,ACME 服务来取 |
| TLS-ALPN-01 | 443 端口可访问 | 在 TLS 握手阶段完成验证,不需要 80 |
所以"80 端口被封"会导致 HTTP-01 失败。国内云服务器要注意安全组是否放行了 80 —— 只放 443 是不够的。
三个最常见的失败原因
- DNS 还没生效就去启动 Caddy。ACME 服务解析不到你的域名,直接失败。加完记录等几分钟再起服务。
- 开了 CDN 代理(例如橙色云朵)。请求先到 CDN,验证文件取不到。签发期间要先关代理,签完再打开。
- 多个域名写在一个块里,其中一个没解析。整块会反复重试,日志里全是报错。做法是先把能用的那个单独跑通,再加下一个。
给纯 IP 签证书
给 IP 地址签证书需要 ACME 的短期证书配置(Let's Encrypt 的 shortlived 类证书),有效期明显短于域名证书,续期更频繁。能上域名就不要用 IP 证书 —— 兼容性和稳定性都差一档。
证书存在哪里
Caddy 的证书和私钥在自己的数据目录(systemd 安装通常是 /var/lib/caddy/.local/share/caddy)。想备份证书,备份整个数据目录,不要单独拷 .crt。
验证方法
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
看到 issuer 是 Let's Encrypt、notAfter 在三个月内,说明走的是自动签发这条链路。
本文为个人学习记录,可能存在错误或已过时,仅供参考。
← 返回笔记列表