Caddy 自动 HTTPS 是怎么工作的

2026 / 10 / 06#caddy#https#acme

它替你做了什么

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 是不够的。

三个最常见的失败原因

  1. DNS 还没生效就去启动 Caddy。ACME 服务解析不到你的域名,直接失败。加完记录等几分钟再起服务。
  2. 开了 CDN 代理(例如橙色云朵)。请求先到 CDN,验证文件取不到。签发期间要先关代理,签完再打开。
  3. 多个域名写在一个块里,其中一个没解析。整块会反复重试,日志里全是报错。做法是先把能用的那个单独跑通,再加下一个。

给纯 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 在三个月内,说明走的是自动签发这条链路。

本文为个人学习记录,可能存在错误或已过时,仅供参考。
← 返回笔记列表