本文记录使用 acme.sh 为 Nginx 申请和部署 Let's Encrypt 证书的常用流程。
1. 安装 acme.sh
curl https://get.acme.sh | sh -s email=youeremail
source ~/.bashrc
acme.sh --set-default-ca --server letsencrypt2. 配置 HTTP 验证入口
先准备一个统一的 80 端口站点,用于放置 acme-challenge 验证文件,并将普通访问重定向到 HTTPS。
server {
listen 80 default_server;
server_name _;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}说明:
- default_server 表示当没有其他 server 块匹配时,流量会进入这里。
- server_name _ 用作兜底匹配。
- 所有域名都可以共用同一个验证目录 /var/www/html。
3. 签发证书
单个域名:
acme.sh --issue -d newdomain.com --webroot /var/www/html/多个域名可以通过重复 -d 追加,最多支持 100 个域名。
4. 安装证书
建议先为目标域名准备独立目录,再把证书安装到固定路径中。
mkdir -p /etc/nginx/ssl/yourdomain/
acme.sh --install-cert -d yourdomain \
--key-file /etc/nginx/ssl/yourdomain/private.key \
--fullchain-file /etc/nginx/ssl/yourdomain/fullchain.cer \
--reloadcmd "systemctl reload nginx"--reloadcmd 会在证书更新后自动重载 Nginx。
5. 配置 HTTPS 站点
把证书路径和业务配置写入 443 端口的 server 块中。
server {
listen 443 ssl;
server_name yourdomain;
ssl_certificate /etc/nginx/ssl/yourdomain/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/yourdomain/private.key;
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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
location / {
index index.html;
proxy_pass http://127.0.0.1:8080;
}
}说明:
- 如果是静态站点,可以把 proxy_pass 替换为 root。
- 如果是反向代理场景,保留 proxy_pass,并按实际业务补充 proxy_set_header。
6. 续期建议
acme.sh 会自动处理续期任务。证书部署后,建议确认:
- Nginx 的证书路径是否与安装命令一致。
- 续期后是否能够正常执行 systemctl reload nginx。
- 80 端口的验证路径是否仍然可访问。