acme配置nginx申请SSL证书教程
要使用 Nginx + ACME 自动文件验证 申请 SSL 证书,推荐使用轻量工具 acme.sh(自动化程度高、支持自动续期、无需依赖复杂环境)。以下是完整步骤,适用于 CentOS/Debian/Ubuntu 系统。
一、核心原理
ACME 协议的 HTTP-01 验证(文件验证)流程:
- 向 Let's Encrypt 申请证书时,ACME 客户端会生成一个随机验证文件(如
/.well-known/acme-challenge/xxx)。 - Let's Encrypt 服务器会访问你的域名
http://example.com/.well-known/acme-challenge/xxx,验证文件是否存在且内容正确。 - 验证通过后,Let's Encrypt 颁发证书。
二、前置条件
- 已安装 Nginx(需确保 Nginx 正常运行,且 80 端口对外开放,HTTP-01 验证依赖 80 端口)。
- 域名已解析到服务器 IP(如
example.com指向你的服务器)。 - 服务器已安装
curl、git(用于安装 acme.sh)。
三、步骤 1:安装 acme.sh
acme.sh 是纯 Shell 脚本,无需 root 也可安装(推荐普通用户安装,更安全),但申请证书时可能需要读写 Nginx 配置目录,建议用 sudo 执行。
# 1. 安装依赖(CentOS 示例,Debian/Ubuntu 用 apt-get)
sudo yum install -y curl git openssl
# 2. 安装 acme.sh(自动添加环境变量,支持全局调用)
curl https://get.acme.sh | sh -s email=your-email@example.com
# 替换为你的邮箱(用于证书到期提醒)
# 中国大陆安装可参考,或者多试几次以上安装命令
https://github.com/acmesh-official/acme.sh/wiki/Install-in-China
# 3. 生效环境变量(无需重启,临时生效)
source ~/.bashrc安装完成后,验证是否可用:
acme.sh --version
# 输出类似:acme.sh v3.0.6 (版本号可能不同)四、步骤 2:配置 Nginx 支持 ACME 验证
需让 Nginx 对 /.well-known/acme-challenge/ 路径的请求进行正确转发,指向 acme.sh 生成验证文件的目录(默认 /home/[用户名]/.acme.sh/)。
步骤 1:创建验证转发规则
编辑 Nginx 全局配置或域名配置文件(以 CentOS 为例,Nginx 配置目录 /etc/nginx/conf.d/):
sudo vim /etc/nginx/conf.d/acme-verify.conf添加以下内容(核心是暴露验证目录):
# ACME 验证文件目录转发
location /.well-known/acme-challenge/ {
# 指向 acme.sh 生成验证文件的目录(默认路径,无需修改)
root /www/wwwroot/acmewww/;
# 允许访问该目录下的所有文件
try_files $uri =404;
# 关闭缓存(避免验证文件被缓存导致失败)
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
步骤 2:已存在域名配置引入转发规则
如果已有 example.com 的 Nginx 配置(80 端口),直接在 server 块中添加以下 location 即可:
server {
listen 80;
server_name example.com www.example.com;
# 其他原有配置...
# 引入规则
include acme-verify.conf;
}验证 Nginx 配置并重启
# 检查配置是否有误
sudo nginx -t
# 重启 Nginx 生效
sudo systemctl restart nginx五、步骤 3:用 acme.sh 自动申请证书(文件验证)
执行以下命令,acme.sh 会自动生成验证文件、完成 Let's Encrypt 验证,并颁发证书:
acme.sh --issue \
-d example.com \ # 主域名(必填)
-d www.example.com \ # 额外域名(可选,支持多个 -d)
--webroot /home/$(whoami)/.acme.sh/ \ # 验证文件存放目录(与 Nginx 配置一致)
--nginx \ # 自动检测 Nginx 配置(可选,辅助验证)
--force \ # 强制重新申请(可选,首次申请可省略)
--debug # 调试模式(可选,失败时启用排查问题)成功标志
输出类似以下内容,说明证书申请成功:
[Thu Nov 20 10:00:00 UTC 2025] Your cert is in: /home/your-user/.acme.sh/example.com/example.com.crt
[Thu Nov 20 10:00:00 UTC 2025] Your cert key is in: /home/your-user/.acme.sh/example.com/example.com.key
[Thu Nov 20 10:00:00 UTC 2025] The intermediate CA cert is in: /home/your-user/.acme.sh/example.com/ca.crt
[Thu Nov 20 10:00:00 UTC 2025] And the full chain certs is there: /home/your-user/.acme.sh/example.com/fullchain.crt六、步骤 4:配置 Nginx 使用 SSL 证书
将申请到的证书配置到 Nginx 的 HTTPS 服务(443 端口),编辑域名配置文件:
sudo vim /etc/nginx/conf.d/example.com.conf添加以下 HTTPS 配置(替换证书路径为实际路径):
# HTTPS 服务(443 端口)
server {
listen 443 ssl;
server_name example.com www.example.com;
# 证书路径(从 acme.sh 成功输出中复制)
ssl_certificate /home/your-user/.acme.sh/example.com/fullchain.crt; # 完整链证书
ssl_certificate_key /home/your-user/.acme.sh/example.com/example.com.key; # 私钥
# SSL 优化配置(推荐添加)
ssl_protocols TLSv1.2 TLSv1.3; # 仅支持安全的 TLS 版本
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# 静态资源缓存(可选)
location / {
root /usr/share/nginx/html; # 你的网站根目录
index index.html index.htm;
}
}
# HTTP 重定向到 HTTPS(强制 HTTPS,可选但推荐)
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}验证配置并重启 Nginx
sudo nginx -t # 检查配置
sudo systemctl restart nginx # 重启生效七、步骤 5:自动续期证书
acme.sh 会自动添加 定时任务(每天检查一次,证书到期前 30 天自动续期),无需手动操作。
验证定时任务
# 查看 acme.sh 的定时任务
crontab -l | grep acme.sh输出类似(自动生成,无需修改):
0 0 * * * "/home/your-user/.acme.sh"/acme.sh --cron --home "/home/your-user/.acme.sh" > /dev/null手动测试续期(可选)
acme.sh --renew -d example.com --force常见问题排查
验证失败(提示文件不存在):
- 检查 Nginx 配置的
root路径是否与--webroot一致(均为/home/your-user/.acme.sh/)。 - 确保 80 端口未被防火墙拦截(
sudo firewall-cmd --permanent --add-port=80/tcp && sudo firewall-cmd --reload)。 - 域名解析是否生效(本地
ping example.com确认指向服务器 IP)。
- 检查 Nginx 配置的
Nginx 启动失败:
- 检查证书路径是否正确(复制 acme.sh 成功输出的路径,避免手动输入错误)。
- 用
sudo nginx -t查看具体错误信息(如端口被占用、语法错误)。
acme.sh 命令未找到:
- 执行
source ~/.bashrc生效环境变量,或重新登录服务器。
- 执行
总结
通过 acme.sh + Nginx 实现 ACME 自动文件验证,核心是:
- 安装 acme.sh 工具。
- 配置 Nginx 暴露 ACME 验证目录。
- 用 acme.sh 自动申请/续期证书。
- 将证书配置到 Nginx HTTPS 服务。
整个流程无需手动上传验证文件,证书到期自动续期,适合生产环境长期使用。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1388.html
转载时须注明出处及本声明
教程很棒,但自动续期那。
80端口配置的
location /.well-known/acme-challenge/ {
最终的80里没有了?
就无法自动续期了吧?