---
title: 路线 A：Linux 云服务器 + Certbot 完整教程
url: https://www.paibaowork.com/ssl/deploy/certbot/
last_verified: 2026-10-12
version: v1.0
---

## 一张表看懂

| 项目 | 内容 |
|---|---|
| 适合谁 | 你或技术人员能用 SSH 登录自己的 Linux 云服务器（有 sudo 权限），网站跑在 Nginx 或 Apache 上【判断】 |
| 用时 | 第一次做 20～30 分钟（含验证），熟练后 15 分钟【估算】 |
| 难度 | ★★★（六条路线里最需要敲命令的一条） |
| 花钱 | 0 元：证书由 Let's Encrypt 免费签发，Certbot 自动续期 |
| 前置条件 | 域名已解析到这台服务器；安全组和系统防火墙都放行 80、443；配置里的 `server_name` 写对域名 |
| 成功标志 | 浏览器显示「连接是安全的」；`sudo certbot renew --dry-run` 显示所有模拟续期成功 |

**Certbot** 是 EFF（电子前哨基金会，美国非营利组织）开发的免费工具：自动申请 Let's Encrypt 证书、自动改好 Nginx/Apache 配置、自动建好续期定时任务。官方安装向导在 `https://certbot.eff.org/instructions`，本文按它的推荐流程写，并补上「失败怎么看、怎么修」。

![【真实截图】Certbot 官方安装向导（选择 Nginx + Linux (snap)）](/ssl/images/guide/r02_certbot_instructions.png)

> [!NOTE] 本文的命令是真实跑过的
> 为了给你看「真实的输出」，又不去碰任何真实网站，本文的命令在实验服务器上运行，证书由 Let's Encrypt 官方开源的测试 CA 程序签发。你在正式服务器上**不需要**任何额外参数，输出内容与格式和正式环境一致，只是正式环境的证书由 Let's Encrypt 签发。

## 什么时候选这条路，什么时候别选

选它，如果你：

- 网站放在自己的云服务器上（阿里云 ECS、腾讯云 CVM、AWS、Vultr、搬瓦工……），你能用 SSH 登录；
- 网站由 Nginx 或 Apache 提供（`curl -sI https://你的域名` 的 `server:` 头显示 `nginx` 或 `Apache`）；
- 你或你的技术同事愿意敲几条命令。

别选它，如果你：

- 服务器上装了宝塔面板——用面板点鼠标更快，见[路线 B：宝塔面板](/ssl/deploy/baota/)；
- 只有虚拟主机后台（cPanel）——见〔路线 C：cPanel〕；
- 根本没有服务器权限、只能管域名——见〔路线 D：Cloudflare〕；
- 网站建在 Shopify / Wix / WordPress.com——平台会自动签发，见〔路线 E：SaaS 平台〕。

不确定自己是哪条路线？先读〔部署前预检清单〕和《[网站 SSL 证书免费部署完全指南](/ssl/deploy/ssl-guide/)》第 0.3 节的 6 道题流程图：

![【示意图】6 道题找到你的路线](/ssl/images/guide/d01_flowchart.png)

## 动手前的 4 项前置条件

这四项是「只看不改」的检查，先确认再动手，能挡掉后面 80% 的失败。

| # | 检查项 | 怎么查 | 合格标准 |
|---|---|---|---|
| 1 | 域名解析到本机 | `nslookup 你的域名`，或在浏览器打开 dns.google 查 `type=A` | 显示的 IP 就是这台服务器的公网 IP |
| 2 | 80 和 443 端口外网可达 | 用**手机流量**打开 `http://你的域名` | 能打开网页（哪怕是默认页、403 页） |
| 3 | 有 sudo 权限、能改配置 | `sudo -v`，再 `ls /etc/nginx/`（或 `/etc/apache2/`） | 不报权限错误 |
| 4 | 配置里的域名写对 | `grep -R "server_name" /etc/nginx/` | 包含你要申请的域名，如 `server_name 你的域名 www.你的域名;` |

> [!TIP] 80 端口是证书机构的「验票口」
> Let's Encrypt 默认通过 `http://你的域名/.well-known/acme-challenge/...` 来确认「这个域名确实是你的」。所以**申请期间 80 端口必须对外可达**。如果 80 被安全组挡住，就会看到 `Timeout`。

![【真实截图】在浏览器里用 dns.google 查询域名解析（返回的就是 IP 地址）](/ssl/images/guide/r16_dnsgoogle.png)

### 放行 80 / 443：两道门都要开

云服务器的端口有**两道门**：云控制台里的**安全组**（像小区大门）和服务器系统里的**防火墙**（像家门）。两道都要放行 TCP 80 和 443。

![【示意图】云安全组添加 80/443 入方向规则（以阿里云 ECS 为例，菜单名称以实际控制台为准）](/ssl/images/guide/m11_secgroup.png)

```bash
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
```

逐行解释：第 1 行查看 ufw 防火墙状态，如果显示 `Status: inactive`（未启用），说明这道门本来就开着，后两行可以不做；第 2、3 行分别放行 80 和 443。CentOS / Rocky / AlmaLinux 用 firewalld：

```bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
```

`--permanent` 表示重启后依然有效，`--reload` 让设置马上生效，看到 `success` 即可。

> [!WARNING] 中国大陆服务器要先备案
> 域名解析到中国大陆服务器对外提供网站服务，必须先完成 ICP 备案，否则云厂商会阻断访问，Let's Encrypt 的 HTTP 验证也到不了你的网站。**证书解决不了备案问题**，也不要尝试绕过。服务器在境外（含香港）则不需要备案。

## 步骤总览

| 步骤 | 做什么 | 关键命令 / 位置 | 成功标志 |
|---|---|---|---|
| 0 | 登录服务器 | `ssh root@服务器IP` | 出现 `root@server:~#` 提示符 |
| 1 | 备份配置 + 确认 http 可用 | `sudo cp -a /etc/nginx /root/nginx-backup-$(date +%F)`；`sudo nginx -t` | `syntax is ok`、`test is successful` |
| 2 | 安装 Certbot | `sudo snap install --classic certbot`（或 apt/dnf） | `certbot --version` 能输出版本号 |
| 3 | 申请并安装证书 | `sudo certbot --nginx -d 域名 -d www.域名` | `Congratulations! You have successfully enabled HTTPS` |
| 4 | 确认自动续期 | `sudo certbot renew --dry-run`；`systemctl list-timers \| grep -i certbot` | 全部模拟续期成功 + 能看到定时器 |
| 5 | 浏览器与工具验收 | 访问网站、SSL Labs | 显示「连接是安全的」，评级 A/A+ |

## 第 0 步：登录服务器

1. Windows 用户：打开「Windows 终端」或「PowerShell」（Windows 10/11 自带 ssh 命令）；Mac 用户：打开「终端」。也可以用云厂商网页控制台里的「远程连接 / Workbench / VNC」。
2. 输入（把 IP 换成你的服务器 IP，把 `root` 换成你的用户名）：

```bash
ssh root@47.xx.xx.xx
```

3. 第一次连接会问 `Are you sure you want to continue connecting (yes/no)?`，输入 `yes` 回车。
4. 输入密码（**输入时屏幕不会显示任何字符，这是正常的**），回车。
5. 看到类似 `root@server:~#` 或 `ubuntu@server:~$` 的提示符，说明登录成功。

> [!TIP] 先确认系统和网页软件
> 输入 `cat /etc/os-release` 看系统（Ubuntu / Debian / CentOS / Rocky）。输入 `nginx -v` 和 `apache2 -v`（CentOS 上是 `httpd -v`）看用的是哪个网页软件——哪个能显示版本号就是哪个。后面装 Certbot 时，Nginx 和 Apache 要选不同的插件。

## 第 1 步：备份配置，确认网站能用 http 打开

改任何东西之前，先把配置目录复制一份。

```bash
sudo cp -a /etc/nginx /root/nginx-backup-$(date +%F)
sudo nginx -t
curl -sI http://你的域名 | head -1
```

逐行解释：

1. 把整个 Nginx 配置目录复制一份到 `/root/`，文件夹名带今天的日期（出问题时可以原样恢复）。Apache 换成 `sudo cp -a /etc/apache2 /root/apache2-backup-$(date +%F)`（CentOS 是 `/etc/httpd`）。
2. 检查当前配置语法。应看到 `syntax is ok` 和 `test is successful`。
3. 确认网站 http 能访问，应看到 `HTTP/1.1 200 OK`（或 301/403）。

![【真实命令输出】nginx -t 检查通过](/ssl/images/guide/t09_nginx_t.png)

> [!WARNING] 配置里要写对域名
> Certbot 靠配置文件里的 `server_name`（Nginx）或 `ServerName` / `ServerAlias`（Apache）找到你的网站。用 `grep -R "server_name" /etc/nginx/` 看一眼，必须包含你要申请的域名，例如 `server_name 你的域名 www.你的域名;`。写错了 Certbot 会报「找不到匹配的 server 块」。

## 第 2 步：安装 Certbot

### 方法一（官方推荐）：snap 安装

```bash
sudo apt-get remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
```

逐行解释：

1. 先删掉系统里可能存在的旧版 certbot（没有装过会提示「未安装」，没关系）。
2. 用 snap（Ubuntu 自带的软件商店）安装最新版 Certbot。`--classic` 是官方要求的参数。
3. 建一个「快捷方式」，让你在任何地方都能直接输入 `certbot`。如果提示 `File exists`，说明已经有了，忽略即可。

> [!NOTE] Debian 上先装 snapd
> Ubuntu 默认带 snap。Debian 需要先运行 `sudo apt update && sudo apt install snapd`，然后 `sudo snap install core`，再执行上面的命令。

### 方法二：用系统软件源（apt / dnf）安装

```bash
sudo apt update
sudo apt install certbot python3-certbot-nginx
```

Apache 用户把第二行换成 `sudo apt install certbot python3-certbot-apache`。系统源的版本可能比 snap 旧一些，但同样能用、同样自带自动续期（实验环境里装的是 Certbot 4.0.0）。

### CentOS / RHEL / Rocky / AlmaLinux

```bash
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx
```

逐行解释：第 1 行启用 EPEL（Fedora 社区维护的扩展软件源，certbot 在这里面）；第 2 行安装 Certbot 和 Nginx 插件。Apache（在这些系统里叫 httpd）用户安装 `python3-certbot-apache mod_ssl`。老的 CentOS 7 用 `yum` 代替 `dnf`（CentOS 7 已停止维护，建议尽早升级系统）。

装完检查一下：`certbot --version` 应输出版本号。

## 第 3 步：一条命令申请并安装证书（Nginx）

```bash
sudo certbot --nginx -d 你的域名 -d www.你的域名
```

逐段解释：`--nginx` 表示「用 Nginx 插件：自动验证 + 自动改配置」；每个 `-d` 后面跟一个域名，**根域名和 www 都要写**（把域名换成你自己的）。

第一次运行会问你几个问题：

1. `Enter email address`：填一个常用邮箱（用于重要通知；Let's Encrypt 已不再发到期提醒邮件）。
2. `Please read the Terms of Service ... (Y)es/(N)o`：输入 `Y` 同意服务条款。
3. `Would you be willing ... to share your email address with the EFF`：是否订阅 EFF 新闻，`Y` 或 `N` 都可以。
4. 等待十几秒，看到下面这样的输出就成功了：

![【真实命令输出】certbot --nginx 成功申请并部署证书](/ssl/images/guide/t01_certbot_nginx.png)

**你应该看到的关键字（这就是成功标志）：**

- `Successfully received certificate.`：证书拿到了；
- `This certificate expires on ...`：到期日（约 90 天后）；
- `Certbot has set up a scheduled task to automatically renew`：自动续期已安排；
- `Congratulations! You have successfully enabled HTTPS`：已经部署到 Nginx。

Certbot 自动改了你的 Nginx 配置：加了 443 端口和证书路径，并把 80 端口的访问 **301 跳转**到 https。带 `# managed by Certbot` 的行就是它加的：

![【真实命令输出】Certbot 修改后的 Nginx 配置文件](/ssl/images/guide/t02_nginx_conf.png)

> [!TIP] 想自己改配置？
> 用 `sudo certbot certonly --nginx -d 你的域名 -d www.你的域名` 只申请证书、不改配置。证书在 `/etc/letsencrypt/live/你的域名/fullchain.pem`，私钥在 `/etc/letsencrypt/live/你的域名/privkey.pem`，在 Nginx 里分别填到 `ssl_certificate` 和 `ssl_certificate_key`。**私钥文件不要发给任何人**，也不要贴进聊天工具。

## 第 4 步：Apache 用户

```bash
sudo certbot --apache -d 你的域名 -d www.你的域名
```

和 Nginx 完全一样，只是把 `--nginx` 换成 `--apache`。Certbot 会新建一个 `-le-ssl.conf` 结尾的配置文件，并加好跳转。完成后检查：

```bash
sudo apachectl configtest
```

应看到 `Syntax OK`。CentOS 上如果报 `mod_ssl` 相关错误，先 `sudo dnf install mod_ssl` 再重试。

## 第 5 步：插件识别不了网站时（webroot 方式）

如果你的网站是 Docker、Node.js 等特殊架构，Certbot 插件识别不了，可以用 **webroot**（网站根目录）方式：

```bash
sudo certbot certonly --webroot -w /var/www/html -d 你的域名 -d www.你的域名
```

`-w` 后面填网站文件所在目录。Certbot 会在其中的 `.well-known/acme-challenge/` 放一个临时文件，Let's Encrypt 通过 `http://你的域名/.well-known/acme-challenge/...` 读取它来确认你控制该域名。拿到证书后需要手动配置到网页软件里。

![【真实截图】Let's Encrypt 官方文档「验证方式（Challenge Types）」页面，介绍 HTTP-01 与 DNS-01](/ssl/images/guide/r17_le_challenge_types.png)

> [!WARNING] webroot 方式的续期要自己重载网页软件
> `--nginx` / `--apache` 插件在续期后会自己重载网页软件；`certonly --webroot` 不会。做法：在 `/etc/letsencrypt/renewal-hooks/deploy/` 目录里放一个脚本，内容为 `systemctl reload nginx`，再 `sudo chmod +x` 让它可执行。

## 第 6 步：验证与验收

三件事都要做：命令验证、浏览器验证、在线检测。

```bash
curl -I http://你的域名
curl -vI https://你的域名 2>&1 | grep -E "subject|date|issuer|verify|HTTP/"
```

第 1 行应返回 `301 Moved Permanently`（http 自动跳 https）；第 2 行应看到 `SSL certificate verify ok` 和正确的到期日。

![【真实命令输出】HTTP 自动 301 跳转到 HTTPS](/ssl/images/guide/t08_redirect.png)

![【真实命令输出】curl 查看证书：subject（颁发给谁）、start/expire date（起止日期）、issuer（谁颁发的）、verify ok（校验通过）](/ssl/images/guide/t06_curl.png)

```bash
echo | openssl s_client -connect 你的域名:443 -servername 你的域名 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates
```

`openssl s_client` 像浏览器一样连接网站的 443 端口并取回证书；`-servername` 告诉服务器你要的是哪个域名（一台服务器常有多个网站）；第二个 `openssl x509` 把证书内容翻译成人能看懂的字；`notAfter` 就是到期时间（GMT 时间，北京时间要加 8 小时）。

![【真实命令输出】openssl 查看到期日；下方是访问过期证书网站时 curl 的报错](/ssl/images/guide/t07_openssl.png)

浏览器里：点地址栏左侧图标 → 应显示「连接是安全的」→ 再点「证书有效」，能看到颁发对象（你的域名）、颁发者、有效期。

![【真实截图】点击地址栏左侧图标后弹出的窗口](/ssl/images/guide/r07_sitepopup1.png)

![【真实截图】点「连接是安全的」后看到「证书有效」](/ssl/images/guide/r08_sitepopup2.png)

最后在 `https://www.ssllabs.com/ssltest/` 输入域名跑一次，目标 **A 或 A+**。

![【真实截图】SSL Labs 检测首页](/ssl/images/guide/r10_ssllabs_home.png)

![【真实截图】SSL Labs 检测结果示例（letsencrypt.org 获得 A+）](/ssl/images/guide/r11_ssllabs_result.png)

> [!TIP] 一定要测这四种网址
> `https://你的域名`、`https://www.你的域名`、`http://你的域名`、`http://www.你的域名`。前两个应该都正常，后两个应该**自动跳转**到 https。手机上也打开一次（手机浏览器对证书链问题更敏感）。

## 第 7 步：确认自动续期（这一步不能省）

Let's Encrypt 证书现在 90 天有效，官方计划 2027-02-10 起默认 64 天、2028-02-16 起 45 天；并且 Let's Encrypt 已于 2025-06-04 停止发送到期提醒邮件。所以「自动续期有没有真的开好」必须自己确认。

```bash
sudo certbot renew --dry-run
sudo certbot certificates
```

第 1 行「演练续期」：不会真正替换证书，只检查续期流程能不能走通。看到 `Congratulations, all simulated renewals succeeded` 即正常。第 2 行列出本机所有证书和剩余天数。

![【真实命令输出】certbot renew --dry-run 演练续期成功](/ssl/images/guide/t04_dryrun.png)

![【真实命令输出】certbot certificates 查看证书和剩余天数](/ssl/images/guide/t03_certificates.png)

Certbot 安装时会自动建好定时任务（每天两次检查，到期前约 30 天自动续期）。确认方法：

```bash
systemctl list-timers | grep -i certbot
```

snap 安装的名字是 `snap.certbot.renew.timer`，apt 安装的是 `certbot.timer`（没有 systemd 的系统则是 `/etc/cron.d/certbot` 定时任务）。

![【真实命令输出】apt 版 Certbot 自带的续期定时器和 cron 文件内容](/ssl/images/guide/t10_timer.png)

![【示意图】systemctl list-timers 的正常输出（终端样式模拟）](/ssl/images/guide/k02_listtimers.png)

> [!WARNING] 手动续期 = 迟早过期
> 不要用「每三个月记得登录一次续期」的方式。人一定会忘，而证书过期后网站会整页红色警告（`NET::ERR_CERT_DATE_INVALID`）。请再用免费监控服务或手机日历（到期前 20 天）做双保险——Let's Encrypt 官方推荐用免费监控服务替代已停发的提醒邮件。

## 申请失败的 5 分钟自查流程

按这个顺序查，基本都能定位：

1. **看输出里的关键词**：`Timeout` 是端口问题，`connection refused` 是网页软件没跑，`NXDOMAIN` 是解析问题，`unauthorized`/`404` 是「访问到的不是这台服务器」。
2. **确认 80 端口对外可达**：用手机流量（不连公司 WiFi）打开 `http://你的域名`。打不开就是安全组或系统防火墙没放行。
3. **确认域名指向本机**：`nslookup 你的域名`，并把结果和云控制台里的公网 IP 对一遍；再看有没有多余的 AAAA 记录。
4. **确认网页软件在运行**：`sudo systemctl status nginx`（或 `apache2` / `httpd`），状态应是 `active (running)`。
5. **确认 `server_name` 写对**：`grep -R "server_name" /etc/nginx/`，必须包含你要申请的域名。
6. **临时关掉干扰项**：如果站点开了 CDN、反向代理或 301 跳转，先关掉再申请，装好后再打开。
7. **用 `--dry-run` 演练**，避免把失败次数用光：`sudo certbot --nginx --dry-run -d 你的域名 -d www.你的域名`。

> [!NOTE] 频率限制（别反复狂试）
> Let's Encrypt 的限制：同一组域名 **7 天内最多签发 5 次**；同一域名**验证失败每小时最多 5 次**。排查问题时一律加 `--dry-run`（只演练、不真正签发）或 `--test-cert`（用测试服务器）。

## 失败排查表

申请或续期失败时，输出里的关键词就是线索。下表前 5 行是「验证失败长什么样」的原文对照，后面几行是常见故障。

![【真实命令输出】验证失败：Let's Encrypt 无法访问 80 端口](/ssl/images/guide/t05_fail.png)

| 输出里的关键词 | 意思 | 怎么办 |
|---|---|---|
| `Type: connection` + `Timeout` | 80 端口被安全组或防火墙挡住 | 两道门都放行 80（见上文「放行 80/443」）；用手机流量访问 `http://域名` 测试 |
| `Type: connection` + `connection refused` | 服务器没有程序在 80 端口上运行 | 启动网页软件：`sudo systemctl start nginx`（或 apache2 / httpd） |
| `Type: dns` + `NXDOMAIN` | 域名没有解析或 DNS 尚未生效 | 用 dns.google 查 A 记录，确认生效后再申请 |
| `Type: unauthorized` + `404` | 访问到的不是这台服务器；或有重写/跳转规则拦住了验证文件 | 删除指向旧服务器的 AAAA 记录；临时关掉 301/CDN；检查网站根目录 |
| `too many failed authorizations` | 失败次数太多被暂时限制（同一域名每小时 5 次） | 等一小时，先排查再用 `--dry-run` 测试 |
| `CAA record` 不允许 | CAA 记录未包含 letsencrypt.org | 在 DNS 里添加 `0 issue "letsencrypt.org"`，或删掉旧的 CAA 记录 |
| `too many certificates` | 触发了签发频率限制（同一组域名 7 天内最多 5 次） | 等待并排查；用 `--dry-run` 演练、`--test-cert` 用测试服务器，别反复狂试 |
| 浏览器 `ERR_TOO_MANY_REDIRECTS` | 多处重复跳转（例如又开了 CDN 的强制 https） | 只保留一处跳转 |
| `NET::ERR_CERT_COMMON_NAME_INVALID` | 证书没包含当前访问的域名（如少了 www） | 重新申请时把根域名和 www 都写上 |
| `NET::ERR_CERT_DATE_INVALID` | 证书已过期 | 立即 `sudo certbot renew`，然后查自动续期为什么失效 |
| 手机打不开、电脑正常 | 证书链不完整（只装了域名证书，没装中间证书） | Nginx 用 `fullchain.pem`；SSL Labs 看 Chain issues |
| 证书到期没自动续 | 定时任务没运行；续期时 80 端口被关；后来开了 CDN/301；改过网页配置 | `sudo certbot renew --dry-run` 看报错，按上面几行排查 |
| 改完 Nginx 配置后网站全挂 | 配置语法错误 | `sudo nginx -t` 看错误行；用备份恢复：`sudo cp -a /root/nginx-backup-日期/. /etc/nginx/` 后 `sudo systemctl reload nginx` |
| 中国大陆服务器，验证一直失败或访问显示备案提示 | 域名未备案，访问被云厂商阻断 | 完成备案，或把网站迁到境外服务器；证书解决不了备案问题 |

## 常见坑（踩过一次就记住）

1. **只写了根域名，没写 www。** 结果访问 `https://www.你的域名` 报「名称不符」。申请时 `-d 根域名 -d www.域名` 两个都要写。
2. **有一条指向旧服务器的 AAAA（IPv6）记录。** 这是验证失败的隐形杀手：Let's Encrypt 可能走 IPv6 去验证，结果连到一台已经不用了的机器。用 dns.google 查 `type=AAAA` 确认。
3. **装完就以为完事了。** 强制跳转、混合内容、自动续期、到期监控这四件事一件都不能少（见下节）。
4. **混合内容（Mixed Content）**：页面本身是 https，但里面的图片、脚本还是 `http://` 地址，浏览器仍会提示「不安全」。按 `F12` 打开控制台搜 `Mixed Content` 逐个改成 https。
5. **HSTS 先别急着开。** HSTS 会让浏览器在一段时间内「只认 https」，一旦证书出问题，访客连「继续访问」按钮都没有。建议全站 https 稳定运行几周后再考虑，并从较短有效期开始。
6. **Cloudflare 源证书不能直接给访客用。** 它只在「Cloudflare ↔ 你的服务器」这一段有效，浏览器不信任；直接访问会报 `NET::ERR_CERT_AUTHORITY_INVALID`。
7. **私钥和令牌不要外发。** 需要输入密钥时在自己终端里输入（例如 `read -s`），不要贴在聊天里；用过的一次性令牌事后撤销。

## 多域名、通配符与「换服务器」

### 一张证书能放几个域名

Certbot 写多个 `-d` 参数即可，例如 `-d 你的域名 -d www.你的域名 -d shop.你的域名`。Let's Encrypt 一张证书最多包含 100 个域名。不同根域名也可以放在同一张证书里，但一般建议每个网站各用一张，互不影响。

### 什么时候才需要通配符证书

`*.你的域名` 覆盖所有一级子域名（`www.`、`shop.`、`m.`），但**不覆盖** `你的域名` 本身，也不覆盖 `a.b.你的域名`。免费证书支持通配符，但**只能用 DNS 验证**：

```bash
sudo certbot certonly --manual --preferred-challenges dns \
  -d 你的域名 -d '*.你的域名'
```

这条命令会提示你在 DNS 里添加一条 `_acme-challenge` 的 TXT 记录，验证通过后才签发。注意：`--manual` 方式默认**不会自动续期**，每 90 天都要人工再来一次——除非你把 DNS 服务商的 API 令牌接进来做自动验证。子域名不多时，直接把每个子域名写进同一张证书更简单，也更省心。

> [!TIP] 名词：TXT 记录
> **TXT 记录**：一条写着任意文字的 DNS 记录，常用来「证明身份」——证书机构让你临时写一句话进去，能写进去就说明域名归你管。

### 换服务器、换建站公司怎么办

在新服务器上重新申请即可：免费、几分钟，**不需要「迁移证书」**。正确顺序是：先在新服务器上把网站准备好（域名仍指向老服务器）→ 修改 DNS 指向新服务器 → DNS 生效后立即申请证书，这样不会出现证书错误的窗口期。原服务器上的证书留在原地即可，不做任何处理。

## 把这件事交给 AI 智能体

如果你不想自己敲命令，可以把本页的「一键复制给智能体」提示词复制给常用的 AI 智能体（豆包、ChatGPT、Claude、Codex 等），它会按同样的顺序先问你问题、做只读预检、再一步一步带你执行，每一步改动前先征求你的同意。

> [!WARNING] 交给智能体也要守这几条
> 1. 密码、SSH 私钥、API 令牌不要发到对话里；需要输入时在自己终端里输入。
> 2. 它说「我要执行……」时，看清「改什么、怎么撤销」再回复「继续」。
> 3. 先备份再改；Cloudflare 之类的 API 令牌要最小权限、单一域名、用完撤销。
> 4. 不要因为任何人的建议去买「金融级证书」——免费 DV 证书和付费证书的加密强度完全一样。

## 装好之后还要做的两件事

**① 确认强制跳转已生效。** `--nginx` / `--apache` 默认已自动添加 301。只有在你手动配置、没有用 Certbot 时，才需要自己在 Nginx 里写：

```nginx
server {
    listen 80;
    server_name 你的域名 www.你的域名;
    return 301 https://$host$request_uri;
}
```

逐行解释：监听 80 端口（http）；匹配你的域名；把请求以 301 永久跳转到同一地址的 https 版本（`$host` 是访客访问的域名，`$request_uri` 是后面的路径和参数）。改完记得 `sudo nginx -t` 再 `sudo systemctl reload nginx`。

**② 设置证书到期监控。** Let's Encrypt 已不再发提醒邮件，自己设一个「闹钟」：用免费监控服务（到期前发邮件），或在手机日历里按到期日提前 20 天设提醒，内容写「检查网站证书是否已自动续期」。

> [!NOTE] 一页速查（可以截图存手机）
> 装：`sudo snap install --classic certbot && sudo ln -s /snap/bin/certbot /usr/local/bin/certbot`
> 签：`sudo certbot --nginx -d 域名 -d www.域名`
> 验：`sudo certbot renew --dry-run` + `systemctl list-timers | grep -i certbot`
> 坏：`sudo nginx -t`；恢复 `sudo cp -a /root/nginx-backup-日期/. /etc/nginx/ && sudo systemctl reload nginx`

## 出事了怎么回滚

万一改完配置网站打不开，按这个顺序恢复，5 分钟内能回到动手前的状态：

1. **先看错误行**：`sudo nginx -t`（Apache 用 `sudo apachectl configtest`）会指出是哪一行语法错误。
2. **恢复备份配置**：

```bash
sudo cp -a /root/nginx-backup-日期/. /etc/nginx/
sudo nginx -t
sudo systemctl reload nginx
```

3. **如果只是证书本身有问题**，可以让 Certbot 撤销并删掉这张证书，重新申请：

```bash
sudo certbot delete --cert-name 你的域名
```

4. **确认网站已恢复**：`curl -sI http://你的域名 | head -1` 应重新返回 `200` 或 `301`。

> [!WARNING] 备份文件放在服务器上只是「同一台机器内的后悔药」
> 如果整台服务器出问题，服务器上的备份也跟着没了。重要配置建议另外留一份在本地电脑（例如把 `/etc/nginx` 打包下载），这样换服务器时直接照搬，不用从零重配。

## 常见问题

### Certbot 要花钱吗？装完以后还需要每年付费续期吗？

不要钱。Certbot 是 EFF 开发的免费开源工具，证书由 Let's Encrypt 免费签发，每 90 天自动续期，不需要任何费用。如果有人告诉你「不续费证书就失效」，那说的是他自己卖的付费证书，不是 Let's Encrypt。免费 DV 证书和付费证书的加密强度、浏览器信任完全一样。

### snap 安装和 apt、dnf 安装有什么区别，我该选哪个？

功能完全一样，都自带自动续期。snap 是 Certbot 官方推荐的安装方式，版本最新；apt 和 dnf 用的是系统软件源里的版本，可能稍旧但同样能用。Ubuntu 用 snap 最省事，Debian 要先装 snapd，CentOS 系列先装 epel-release 再装 certbot。选哪个都行，装完用 certbot --version 能输出版本号就说明成功了。

### 一张证书能不能同时包含根域名和 www？

能，而且建议这么做。申请时写两个 -d 参数，例如 -d 你的域名 -d www.你的域名，这样访问带 www 和不带 www 都不会报「名称不符」。Let's Encrypt 一张证书最多可以包含 100 个域名。

### certbot renew 需要我手动执行吗？

不需要。安装 Certbot 时会自动建好定时任务，每天检查两次，证书到期前约 30 天自动续期并重新加载 Nginx 或 Apache。你只需要在装好后跑一次 certbot renew --dry-run 确认演练续期成功，再用 systemctl list-timers 配合 grep 确认定时器存在（名字是 certbot.timer 或 snap.certbot.renew.timer）。

### 网站是 Docker 或 Node.js 部署的，Certbot 插件认不出来怎么办？

用 webroot 方式：把网站文件所在目录传给 -w 参数，例如 sudo certbot certonly --webroot -w /var/www/html -d 你的域名。Certbot 会在该目录的 .well-known/acme-challenge/ 下放临时文件供验证，拿到证书后你自己把证书路径配到网页软件里。注意这种方式续期后不会自动重载网页软件，需要在 /etc/letsencrypt/renewal-hooks/deploy/ 放一个执行 systemctl reload nginx 的脚本。

### 证书装好了，浏览器为什么还提示不安全？

最常见的是混合内容：页面本身是 https，但里面的图片、脚本、样式还是 http 地址。按 F12 打开控制台，搜索 Mixed Content，把列出的 http 地址改成 https；也可以在 Cloudflare 打开自动 HTTPS 重写。另一种情况是只装了域名证书没装中间证书，手机端会提示证书不可信，Nginx 要用 fullchain.pem 而不是 cert.pem。

## 资料来源与核实记录

| 事实 | 来源 | 核实日期 |
|---|---|---|
| Certbot 官方安装说明（Nginx + Linux/snap）与申请命令 | https://certbot.eff.org/instructions?ws=nginx&os=snap | 2026-10-10 |
| Let's Encrypt 验证方式（HTTP-01 / DNS-01） | https://letsencrypt.org/docs/challenge-types/ | 2026-10-10 |
| Let's Encrypt 频率限制（同一组域名每周 5 次签发、每小时 5 次验证失败） | https://letsencrypt.org/docs/rate-limits/ | 2026-10-10 |
| Let's Encrypt 证书有效期将缩短至 64/45 天（公告 2025-12-02） | https://letsencrypt.org/2025/12/02/from-90-to-45 | 2026-10-10 |
| Let's Encrypt 到期提醒邮件服务已结束（2025-06-26） | https://letsencrypt.org/2025/06/26/expiration-notification-service-has-ended.html | 2026-10-10 |
| CA/Browser Forum SC-081v3 证书有效期时间表（200→100→47 天） | https://cabforum.org/2025/04/11/ballot-sc081v3-introduce-schedule-of-reducing-validity-and-data-reuse-periods/ | 2026-10-10 |
| nginx 官方文档：ssl_certificate 与证书链（fullchain） | https://nginx.org/en/docs/http/ngx_http_ssl_module.html | 2026-10-10 |

## 更新记录

- 2026-10-12 · v1.0：上线：指南第 4 章改写为独立路线教程，补 5 分钟自查流程、失败排查表、常见坑与回滚步骤。
