使用 Let's Encrypt 免费 IP 证书部署 HTTPS 网站
1. 背景
Let’s Encrypt 于本周正式发布了纯 IP TLS 证书的免费申请,一举打破 ZeroSSL 等收费证书服务商的垄断,现在人人都可以方便地自行部署纯 IP HTTPS 网站了。
由于 Let’s Encrypt 免费 IP 证书的有效期较短(5 天),因此必须使用支持自动续期的证书部署方案,比如 acme.sh、Nginx Proxy Manager 等。
本文简述使用 Caddy 部署的方法。Caddy 的配置简单好写,对个人用户来说是绝佳选择。
1.1. 为什么不用域名?
在很多情况下,纯 IP HTTPS/TLS 仍有其用武之地,比如:
- 阿里云服务器公开 HTTPS 服务必须为域名备案,用高位端口也无济于事。此时纯 IP HTTPS 就能派上用场
- 自建 Tailscale 中继节点,即使是纯 IP 部署也需要有效的 IP TLS 证书
- 自建梯子节点时,有时有此需求
2. 方法
编写
docker-compose.yml部署 Caddy(Windows 上则直接下载可执行文件)。注意 Caddy 必须是 v2.10.1 及以上的版本由于是纯 IP 证书申请,Let’s Encrypt 只能使用 HTTP-01 Challenge 来确认服务器身份,因此必须对外公开 80 端口
services: # ... caddy: container_name: caddy image: 'caddy:latest' restart: unless-stopped ports: - 80:80 # For IP cert HTTP-01 Challenge - 443:443 volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro - ./caddy/caddy-config:/config - ./caddy/caddy-data:/data确保云服务器防火墙对外放行 443 和 80 端口
编写
Caddyfile:{ # When SNI is not present, fallback to public server IP # to prevent Caddy looking up certs with its own docker container's IP default_sni <你服务器的IP地址> } <你服务器的IP地址> { tls { issuer acme { profile shortlived } } # ...后面跟其他的正常配置。比如反向代理配置等 }以服务器 IP
111.22.33.44,反代 localhost 为例:{ # When SNI is not present, fallback to public server IP # to prevent Caddy looking up certs with its own docker container's IP default_sni 111.22.33.44 } 111.22.33.44 { tls { issuer acme { profile shortlived } } encode gzip # 反代localhost:12345 reverse_proxy localhost:12345 { header_up X-Real-IP {remote_host} # 传递客户端真实IP } }执行
docker compose up -d(或者启动可执行文件),启动 Caddy 服务器Enjoy!
3. Tips
Caddy 会自动申请、续期 IP 证书,无需人工干预。让你稳坐一回甩手掌柜
4. Credits
Support for CA certs on bare IP addresses · Issue #7118 · caddyserver/caddy
使用 Let's Encrypt 免费 IP 证书部署 HTTPS 网站
https://blog.openyq.top/posts/53731/