教程

使用 acme.sh 申请 Let's Encrypt 免费 IP SSL 证书并配置 Nginx

2026-11-09 #Debian#Nginx#acme.sh#SSL证书#Let's Encrypt

随着 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
2
3
4
5
# 如果你使用的是默认的 bash:
source ~/.bashrc

# 如果你使用的是 zsh:
source ~/.zshrc

将默认 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
2
3
4
5
6
7
acme.sh --issue \
--server letsencrypt \
--certificate-profile shortlived \
--days 3 \
-d 1.2.3.4 \
-w /var/www/html \
--keylength ec-256

参数说明:

  • --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
2
3
4
5
6
acme.sh --install-cert \
-d 1.2.3.4 \
--ecc \
--key-file /etc/nginx/ssl/ip_cert/privkey.pem \
--fullchain-file /etc/nginx/ssl/ip_cert/fullchain.pem \
--reloadcmd "systemctl reload nginx"

执行成功后,acme.sh 会记录该安装路径和重载命令,后续每隔 3 天自动续期时会自动覆盖新证书并平滑重载 Nginx。

5. 配置 Nginx 默认站点

通常我们将 IP 站点配置为 Nginx 的 default_server。这样不仅可以通过 https://IP 直接安全访问,还能防止恶意扫描器通过直接访问 IP 探测出服务器上绑定的真实域名证书(防止 SNI 泄露)。

编辑 /etc/nginx/sites-enabled/default 文件,将其内容替换为以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;

root /var/www/html;

# 保留 ACME 证书自动续期的验证路径,切勿删除
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
try_files $uri =404;
}

# 其他 HTTP 请求全部重定向至 HTTPS
location / {
return 301 https://$host$request_uri;
}
}

server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
http2 on;
server_name _;

root /var/www/html;
index index.html index.htm index.nginx-debian.html;

# SSL 证书配置
ssl_certificate /etc/nginx/ssl/ip_cert/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/ip_cert/privkey.pem;

# 现代 TLS 安全参数
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

location / {
try_files $uri$uri/ =404;
# 如果你纯粹是为了防止恶意扫描,不想展示默认网页,可以取消下一行的注释直接断开连接:
# return 444;
}
}

保存文件后,先检测 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
2
3
4
5
# 查看已管理的证书列表及下次续期时间
acme.sh --list

# 查看定时任务是否已写入 crontab
crontab -l
评论
分享

评论