要使用 Nginx + ACME 自动文件验证 申请 SSL 证书,推荐使用轻量工具 acme.sh(自动化程度高、支持自动续期、无需依赖复杂环境)。以下是完整步骤,适用于 CentOS/Debian/Ubuntu 系统。

一、核心原理

ACME 协议的 HTTP-01 验证(文件验证)流程:

  1. 向 Let's Encrypt 申请证书时,ACME 客户端会生成一个随机验证文件(如 /.well-known/acme-challenge/xxx)。
  2. Let's Encrypt 服务器会访问你的域名 http://example.com/.well-known/acme-challenge/xxx,验证文件是否存在且内容正确。
  3. 验证通过后,Let's Encrypt 颁发证书。

二、前置条件

  1. 已安装 Nginx(需确保 Nginx 正常运行,且 80 端口对外开放,HTTP-01 验证依赖 80 端口)。
  2. 域名已解析到服务器 IP(如 example.com 指向你的服务器)。
  3. 服务器已安装 curlgit(用于安装 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

常见问题排查

  1. 验证失败(提示文件不存在)

    • 检查 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)。
  2. Nginx 启动失败

    • 检查证书路径是否正确(复制 acme.sh 成功输出的路径,避免手动输入错误)。
    • sudo nginx -t 查看具体错误信息(如端口被占用、语法错误)。
  3. acme.sh 命令未找到

    • 执行 source ~/.bashrc 生效环境变量,或重新登录服务器。

总结

通过 acme.sh + Nginx 实现 ACME 自动文件验证,核心是:

  1. 安装 acme.sh 工具。
  2. 配置 Nginx 暴露 ACME 验证目录。
  3. 用 acme.sh 自动申请/续期证书。
  4. 将证书配置到 Nginx HTTPS 服务。

整个流程无需手动上传验证文件,证书到期自动续期,适合生产环境长期使用。

标签: none

仅有一条评论

  1. xiaobai xiaobai

    教程很棒,但自动续期那。
    80端口配置的
    location /.well-known/acme-challenge/ {

    最终的80里没有了?
    就无法自动续期了吧?

添加新评论