本文记录一套可复用流程:用 acme.sh 申请 Let’s Encrypt IP 证书,并在 Caddy 中加载使用。
适合没有域名、直接用公网 IP 提供 HTTPS 的场景。
零. 前置说明
- 系统:Debian/Ubuntu(其他 Linux 同理)
- ACME 客户端:
acme.sh - Web 服务:
Caddy - 验证方式:
http-01(80 端口必须公网可达) - 证书类型:ECC(
--ecc)
一、先明确 4 个关键事实(避免方向错)
Let’s Encrypt 默认 profile 不支持 IP 证书
直接用默认参数会报:Default profile does not permit IP address identifiers申请 IP 证书时,要显式指定支持 IP 的 profile(如 shortlived):
--certificate-profile shortlived --days 6
--issue命令必须指定验证方式之一:--standalone/--alpn/-w/--dns等
否则会报:Please specify at least one validation method
Caddy 启动失败最常见不是语法,而是私钥权限:
open /etc/ssl/ip.key: permission denied
二、环境准备
1 | curl https://get.acme.sh | sh |
三、申请 IP 证书(生产可用命令)
以下示例以
127.0.0.1为例;IPv6 写法后面单独给。
方案 A:HTTP-01(standalone,走 80 端口)
1 | acme.sh --issue -d 127.0.0.1 \ |
前提:
- 80 端口公网可达
- 申请时 80 端口不能被 Caddy/Nginx 占用
若被占用(常见):
1 | systemctl stop caddy |
方案 B:TLS-ALPN-01(–alpn,走 443 端口)
当 80 被封禁但 443 可用时,优先用它:
1 | acme.sh --issue -d 127.0.0.1 \ |
前提:
- 443 端口公网可达
- 申请时 443 端口不能被 Caddy 占用
四、安装证书到固定路径(不要直接用 ~/.acme.sh)
1 | acme.sh --install-cert -d 127.0.0.1 --ecc \ |
五、修正文件权限
Caddy 以 caddy 用户运行,默认可能读不到 /etc/ssl/ip.key:
1 | chown root:caddy /etc/ssl/ip.key /etc/ssl/ip.fullchain.crt /etc/ssl/ip.crt |
若不做这步,常见报错:
loading certificates: open /etc/ssl/ip.key: permission denied
六、Caddyfile 正确写法
1)IPv4 示例
1 | http://127.0.0.1 { |
2)IPv6 示例(必须加中括号)
1 | https://[::1] { |
七、上线前检查命令
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
systemctl restart caddy