# 免费 SSL 证书一键部署命令生成器（certbot / acme.sh 自动续期）

> 按服务器和 DNS 服务商生成 certbot 或 acme.sh 命令：安装、阿里云/DNSPod/Cloudflare DNS 验证、通配符证书、Nginx/Apache 部署和自动续期。

Source: https://ssl.sh/zh/tools/acme-command-generator/
Last updated: 2026-11-11

选好 Web 服务器、ACME 客户端和验证方式，就能拿到申请免费证书并自动续期的全部命令，从安装客户端到最后的检查，复制粘贴即可。

这个生成器帮你写好申请 [Let's Encrypt](https://letsencrypt.org/) 免费证书并自动续期的全部命令。选择 Web 服务器、ACME 客户端和验证方式后，把编号步骤依次粘贴到服务器的 root 终端：安装客户端，按需填写 DNS API 密钥，申请证书，接入 Nginx 或 Apache，确认自动续期，最后用 `curl ssl.sh/你的域名` 检查结果。生成过程完全在浏览器里完成。

如果没有服务器的命令行权限，比如虚拟主机，或只能上传证书的 CDN、云控制台，请改用[免费 SSL 证书申请](https://ssl.sh/zh/tools/free-ssl-certificate/)工具。

## 使用方法

1. **域名**：证书要包含的域名，例如 `example.com www.example.com`。勾选“包含通配符”会加上 `*.example.com`，并去掉已被通配符覆盖的子域名。
2. **Web 服务器**：Nginx、Apache、其他或没有 Web 服务器、Caddy、宝塔面板。Caddy 和宝塔会自己申请证书，生成器给出对应的配置或面板操作步骤。
3. **操作系统**：Ubuntu/Debian 或 RHEL 系（Rocky、AlmaLinux、CentOS Stream），影响安装命令和 Apache 服务名（`apache2` 或 `httpd`）。
4. **ACME 客户端**：certbot 或 acme.sh，区别见下表。
5. **验证方式**：HTTP（80 端口）或 DNS API。通配符证书只能用 DNS。
6. **更多选项**：密钥类型（默认 ECDSA P-256，需要兼容很老的客户端时选 RSA 2048）、可选的邮箱，以及 acme.sh 的 Gitee 镜像（服务器在中国大陆时建议勾选）。

## certbot 和 acme.sh 对比

两个都是成熟的 ACME 客户端，都会自动续期，主要区别在安装方式和支持的 DNS 服务商。

| | certbot | acme.sh |
|---|---|---|
| 安装 | snap 包（`snap install --classic certbot`） | Shell 脚本装到 `~/.acme.sh`，国内可用 Gitee 镜像 |
| 默认 CA | Let's Encrypt | ZeroSSL，用 `--set-default-ca --server letsencrypt` 切换 |
| 配置 Web 服务器 | `--nginx`、`--apache` 插件直接改配置 | `--install-cert` 复制证书并记住 `--reloadcmd` |
| DNS API | Cloudflare、Route 53 等官方插件 | 一百多家，包括阿里云 DNS（`dns_ali`）和腾讯云 DNSPod（`dns_tencent`） |
| 续期 | systemd 定时器 `snap.certbot.renew.timer` | cron 任务执行 `acme.sh --cron` |
| 证书路径 | `/etc/letsencrypt/live/<域名>/` | 由 `--install-cert` 指定 |

选了 certbot 又选了它没有官方插件的 DNS 服务商（阿里云、DNSPod 等）时，生成器会自动改用 acme.sh 并给出提示。

## 每一步在做什么

- **安装**：certbot 按 certbot.eff.org 的推荐用 snap 安装，DNS 插件需要先允许 `trust-plugin-with-root`。acme.sh 以 root 安装并添加 cron 任务，然后把默认 CA 切换到 Let's Encrypt。
- **DNS 密钥**：certbot 读取权限为 600 的 `/root/.secrets/cloudflare.ini` 或 root 用户的 AWS 凭据；acme.sh 第一次读取 `export` 的环境变量后，会保存到 `~/.acme.sh/account.conf`，续期时自动使用。
- **申请证书**：certbot 的 Nginx、Apache 插件一条命令完成 HTTP 验证、安装证书和 HTTPS 跳转。其他情况用 `certonly` 配合 `--webroot`、`--standalone` 或 DNS 插件，并加上 `--deploy-hook`，每次续期后自动重载服务器。
- **安装和配置**：acme.sh 和 certbot `certonly` 之后，会给出 `ssl_certificate` 或 `SSLCertificateFile` 配置行。协议和密码套件可以用 [TLS 配置生成器](https://ssl.sh/zh/tools/tls-config-generator/) 补全。
- **确认续期**：最后的命令只是确认定时任务存在；`certbot renew --dry-run` 会在测试环境完整演练一次续期。

## 运行前确认

- HTTP 验证时，每个域名都要解析到这台服务器，80 端口要在防火墙和云服务器安全组里放行。
- 服务器在中国大陆、域名没有备案时，云厂商通常会拦截 80 端口访问，请用 DNS 验证。
- 域名有 CAA 记录时，必须有一条允许 `letsencrypt.org`，可以用 [CAA 检查](https://ssl.sh/zh/tools/caa-checker/) 确认。
- 第一次尝试可以先用测试环境：certbot 加 `--test-cert`，acme.sh 加 `--staging`，失败不会占用正式环境的[频率限制](https://ssl.sh/zh/errors/lets-encrypt-rate-limit/)。

带排错说明的完整教程：[acme.sh + 阿里云/DNSPod](https://ssl.sh/zh/guides/acme-sh-dnspod-aliyun-dns/)、[Nginx + certbot](https://ssl.sh/zh/guides/nginx-lets-encrypt-certbot/)、[Apache + certbot](https://ssl.sh/zh/guides/apache-lets-encrypt-certbot/)、[certbot + Cloudflare 通配符](https://ssl.sh/zh/guides/certbot-dns-cloudflare-wildcard/)、[宝塔面板](https://ssl.sh/zh/guides/bt-panel-ssl/) 和 [Caddy](https://ssl.sh/zh/guides/caddy-automatic-https/)。


## FAQ

**certbot 和 acme.sh 选哪个？**

certbot 是 EFF 官方客户端，用 snap 安装，能自动修改 Nginx 或 Apache 配置，资料最多。acme.sh 是一个 Shell 脚本，不依赖软件包管理器，支持的 DNS API 多得多（包括阿里云和 DNSPod），国内服务器更常用。两者都会自动续期。

**HTTP 验证和 DNS 验证怎么选？**

每个域名都已解析到这台服务器、80 端口能从公网访问时，用 HTTP 验证，不需要任何密钥。要申请通配符证书、服务器没开 80 端口、域名接了 CDN 或者没有备案时，用 DNS 验证，需要一个能修改解析记录的 API 密钥，权限给到最小即可。

**还需要自己写 crontab 续期吗？**

不需要。certbot 的 snap 包自带 systemd 定时器 snap.certbot.renew.timer，acme.sh 安装时会自动添加 cron 任务。生成的最后几条命令只是确认它们存在，certbot 还会做一次续期演练（--dry-run）。

**为什么 acme.sh 要执行 --set-default-ca？**

acme.sh 从 3.0 版开始默认向 ZeroSSL 申请证书，需要先注册邮箱。这条命令把默认 CA 改成 Let's Encrypt，不需要邮箱，也和后面的步骤一致。

**宝塔面板也要用命令行吗？**

不用。宝塔在“网站 → 设置 → SSL”里内置了 Let's Encrypt，选宝塔面板时生成器只给出面板里的操作步骤。如果你想用 acme.sh 管理宝塔站点的证书，要把证书安装路径和重载命令改成宝塔的，并关闭面板对该站点的自动续签，避免两边互相覆盖。
