随着 Let’s Encrypt 正式支持签发短期(Short-lived)的 IP 地址证书,我们不再需要依赖 ZeroSSL 等繁琐的第三方平台,即可直接通过 acme.sh 为公网 IP 自动申请并续期免费的 HTTPS 证书。
本文将介绍如何在 Debian 13 系统下,使用 acme.sh 配合 Nginx 完成 IP 证书的签发、安装与自动续期配置。
系统环境与前提条件
- 操作系统:Debian 13
- 操作权限:使用
root账户 - Web 服务:Nginx(已安装并运行,且公网 80 和 443 端口已放行)
- IP 要求:拥有独立公网 IPv4 或 IPv6 地址(本文以
1.2.3.4为例)
1. 安装必要的依赖
在开始之前,先更新软件源并安装 acme.sh 运行所需的依赖包及定时任务组件:
1 | apt update && apt install -y curl socat cron openssl ca-certificates nginx |
确保 cron 定时任务服务处于开启状态(用于后续证书自动续期):
1 | systemctl enable --now cron |
2. 安装与初始化 acme.sh
执行官方脚本安装 acme.sh(请将 [email protected] 替换为你自己的邮箱,用于接收证书到期或报错通知):
1 | curl https://get.acme.sh | sh -s [email protected] |
安装完成后,重新连接 SSH 终端,或者直接执行以下命令使环境变量立即生效:
1 | # 如果你使用的是默认的 bash: |
将默认 CA 机构切换为 Let’s Encrypt:
1 | acme.sh --set-default-ca --server letsencrypt |
3. 签发 IP 证书
由于我们使用 Webroot 模式(-w /var/www/html)进行 HTTP-01 验证,请确保 Nginx 当前处于运行状态,且默认站点根目录为 /var/www/html(Debian 下新安装的 Nginx 默认即为该目录)。
将下方命令中的 1.2.3.4 替换为你服务器的实际公网 IP 并执行:
1 | acme.sh --issue \ |
参数说明:
--certificate-profile shortlived:指定使用 Let’s Encrypt 的短期证书配置(IP 证书必须使用此配置,有效期通常为 6 天左右)。--days 3:设置每隔 3 天由acme.sh的定时任务自动续期一次。--keylength ec-256:生成更轻量、性能更好的 ECC(椭圆曲线)证书。
4. 安装证书到 Nginx 目录
不要直接在 Nginx 中引用 ~/.acme.sh/ 目录下的文件。我们需要创建一个专门存放证书的目录,并使用 --install-cert 命令将证书复制过去:
1 | mkdir -p /etc/nginx/ssl/ip_cert/ |
执行安装命令(同样记得替换 1.2.3.4):
1 | acme.sh --install-cert \ |
执行成功后,acme.sh 会记录该安装路径和重载命令,后续每隔 3 天自动续期时会自动覆盖新证书并平滑重载 Nginx。
5. 配置 Nginx 默认站点
通常我们将 IP 站点配置为 Nginx 的 default_server。这样不仅可以通过 https://IP 直接安全访问,还能防止恶意扫描器通过直接访问 IP 探测出服务器上绑定的真实域名证书(防止 SNI 泄露)。
编辑 /etc/nginx/sites-enabled/default 文件,将其内容替换为以下配置:
1 | server { |
保存文件后,先检测 Nginx 配置语法是否正确:
1 | nginx -t |
看到 syntax is ok 和 test is successful 的提示后,重新载入 Nginx 使配置生效:
1 | nginx -s reload |
6. 验证效果与自动续期检查
现在打开浏览器访问 http://你的IP,页面会自动跳转到 https://你的IP,并且浏览器地址栏会显示安全锁标志,点开即可查看到由 Let’s Encrypt 签发的有效 IP 证书。
最后,你可以通过以下命令检查 acme.sh 的定时任务和证书状态,确保后续能够自动续期:
1 | # 查看已管理的证书列表及下次续期时间 |
评论