返回博客

一个可复制的 ssl 目录:泛域名证书从申请到 Nginx 配置一条龙

一个可复制的 ssl 目录:泛域名证书从申请到 Nginx 配置一条龙

泛域名 HTTPS 一键部署:工具包使用说明

手动敲 acme.sh 命令、记路径、写 Nginx,步骤一多就容易漏。下面介绍一种打包好的工具目录:上传到服务器、改一个配置文件、执行一条命令,证书和 Nginx 模板一起搞定。


一、这套工具解决什么问题?

自己部署 HTTPS 时,常见问题包括:

  • 命令参数记不住(DNS 插件、泛域名、安装路径各不一样)

  • 证书文件路径不统一,续期后 Nginx 还要跟着改

  • 每个子域都想单独申请证书,其实泛域名一张就够

  • 首次申请和续期各写一套脚本,维护麻烦

设计思路可以概括成五句话:

  1. 整个文件夹拷走就能用 — 不依赖你服务器上其它目录结构

  2. 证书路径固定 — 总在工具目录下的 cert/你的域名/,续期只换文件不改 Nginx

  3. 默认签泛域名 — 每个根域自动申请 域名 + *.域名,子域不用重复签

  4. 一个配置文件 — 邮箱、域名列表、DNS 商密钥写在一起

  5. 续期交给 acme.sh — 不用单独写续期脚本,定时任务一行命令即可


二、工具目录里有什么?

解压或上传后,大致是这样(名称可能随版本略有不同):

ssl/                      ← 整个文件夹放到服务器,例如 /opt/ssl
├── acme.env.example      ← 配置模板,复制后改名使用
├── acme.env              ← 你的真实配置(含密钥,勿泄露)
├── deploy.sh             ← 主程序:申请证书 + 生成 Nginx 配置
├── reload-nginx.sh       ← 续期成功后重载 Nginx
├── cert/                 ← 证书输出目录(自动生成)
│   └── example.com/
│       ├── fullchain.cer
│       └── example.com.key
├── nginx/                ← 自动生成的 Nginx 配置(自动生成)
│   └── example.com.conf
└── logs/                 ← 续期日志(可选)
    └── acme.log

三、使用步骤(四步)

第 1 步:上传到服务器

把整个 ssl 文件夹传到服务器,例如放在 /opt/ssl。用 scp、FTP、面板上传都可以。

第 2 步:填写配置

cd /opt/ssl
cp acme.env.example acme.env
vim acme.env    # 或用其它编辑器

至少要改这三项:

ACME_EMAIL="你的邮箱@example.com"
DOMAINS="example.com"
DNS_PROVIDER="dns_ali"
  • DOMAINS:你的根域名;多个域用空格分开,如 "example.com another.com"

  • DNS_PROVIDER:域名 DNS 在哪家的插件名,常见有 dns_ali(阿里云)、dns_cf(Cloudflare)、dns_dp(DNSPod)等

再按你选的 DNS 商,填写对应的 AccessKey(模板文件里有注释说明填哪几项)。

第 3 步:执行主程序

chmod +x deploy.sh reload-nginx.sh
./deploy.sh

程序会自动:

  • 检查并安装 acme.sh(若尚未安装)

  • 对每个域名签发泛域名证书,写入 cert/域名/

  • nginx/ 下生成对应的 Nginx 配置文件(含 80 跳转 + 443 SSL)

  • 在终端打印一份相同内容,方便核对

若证书已存在、需要强制重签:

./deploy.sh force

注意:请用 ./deploy.sh,不要用 . deploy.sh(前面加点会变成另一种执行方式,容易搞乱环境)。

第 4 步:启用 Nginx

cp nginx/*.conf /etc/nginx/conf.d/
nginx -t && nginx -s reload

打开生成的 .conf 文件,把里面的 proxy_pass(反代地址)改成你实际的后端端口或服务,再 reload 一次。


四、配置自动续期

Let's Encrypt 证书约 90 天有效。首次运行 ./deploy.sh 时,程序已向 acme.sh 注册了「续期成功后自动 reload Nginx」。

你只需在服务器上加定时任务:

crontab -e

写入(路径按你实际存放目录修改):

0 3 * * * acme.sh --cron >> /opt/ssl/logs/acme.log 2>&1

每天凌晨检查是否需要续期,不用单独写续期脚本


五、子域名还要再申请证书吗?

不用。 泛域名 *.example.com 已经覆盖 www.example.comadmin.example.comapi.example.com 等。

若某个子域要单独配 Nginx 站点:

  1. 复制一份 nginx/example.com.conf 或自己写 server

  2. 只改 server_name 为子域

  3. 证书路径仍指向 cert/example.com/ 下那两个文件


六、多域名、多 DNS 商说明

  • 多个根域:在 DOMAINS 里空格分隔即可,每个域各签一张泛域名证、各生成一个 Nginx 配置文件。

  • 多个 DNS 商:一份配置文件同一时间只支持一种 DNS_PROVIDER;域名必须都在该 DNS 账号(或该 API 能管理)下。若 a.com 在阿里云、b.com 在 Cloudflare,请分两次配置、分两次运行。


七、常见问题

Q:网页仍显示不安全?
检查 Nginx 里 ssl_certificate 是否指向 cert/域名/ 下的文件,是否执行过 nginx -t && nginx -s reload

Q:报错 Unknown parameter: --dns-sleep
这是 acme.sh 参数名问题,正确是 --dnssleep;工具包内已处理,若你自行改命令请注意。

Q:续期后网站挂了?
/opt/ssl/logs/acme.log;常见是 reload 失败或 Nginx 配置语法错误。

Q:DNS 验证一直超时?
检查 API 密钥是否有「添加 TXT 记录」权限;国内 DNS 一般等 20 秒,可在配置里加大等待时间。

Q:密钥存在哪?安全吗?
acme.envcert/*.key 里,只应留在服务器本机,不要发给他人、不要上传到公开网盘。

Q:和手动敲 acme.sh 命令有什么区别?
流程完全一样,工具包只是把标准步骤自动化,并固定路径、生成 Nginx 模板。想深入理解原理,建议先学习 acme.sh 手动签发流程。


八、适合谁用?

  • 个人站、小团队 API、博客、管理后台等需要 HTTPS + 泛域名 的场景

  • 域名 DNS 在阿里云、Cloudflare、DNSPod 等 acme.sh 支持的厂商

  • 希望 少记命令、少踩坑、续期省心 的用户


九、小结

你要做的

命令/操作

首次配置

复制 acme.env.example → 填写 → ./deploy.sh

上线 HTTPS

cp nginx/*.conf 到 Nginx 配置目录 → reload

自动续期

crontab 添加 acme.sh --cron

强制重签

./deploy.sh force

证书路径固定、续期不改 Nginx——记住这两点,后面会省很多心。


工具包随版本更新,若界面或文件名与本文略有出入,以你拿到的压缩包内说明为准。
工具代码:https://gitee.com/reloads/ssl