# 宝塔 Nginx + DNS 验证 申请 SSL 证书（详细操作顺序）

> 适用：已建好站点 `coolcoth.com`、运行目录=`/public`、已配前端控制器伪静态。
> 用 DNS 验证可以**完全绕开** `.well-known/acme-challenge` 路径问题，最稳。

---

## 一、前置确认（1 分钟）

1. 域名 `coolcoth.com` 已在宝塔「网站」里建好站点。
2. 域名解析里**至少有一条 A 记录**指向服务器 `47.107.30.116`
   （这样证书签发后 HTTPS 才能真正用起来；DNS 验证本身不要求域名解析到本机，但上线必须）。
3. 宝塔 → 网站 → `coolcoth.com` → 设置 → 网站目录 → **运行目录 = `/public`**（已设过可跳过）。
4. 伪静态里**只保留**前端控制器那条（去掉之前为 HTTP 验证加的 `.well-known`  location 也行，DNS 用不到它）：
   ```nginx
   try_files $uri $uri/ /index.php?$query_string;
   ```

---

## 二、方式 A：DNS API 自动验证（最推荐，零手动）

> 前提：域名在阿里云 / 腾讯云 / DNSPod / 华为云等主流平台，且你能拿到 API 密钥。

1. 宝塔左侧 **面板设置**（或站点 SSL 页里的「DNS API」入口）。
2. 找到 **DNS API** 配置，选择你的域名服务商（如「阿里云」）。
3. 填入：
   - AccessKey ID
   - AccessKey Secret
   （在对应云服务商的「访问控制 / API 密钥」里创建，**只给 DNS 解析权限**即可，别给全量权限）
4. 保存。
5. 回到 网站 → `coolcoth.com` → **SSL** → **Let's Encrypt**。
6. 验证方式下拉选 **DNS验证**（或「DNS API」）。
7. 勾选要签的域名（`coolcoth.com` 和 `www.coolcoth.com`）。
8. 点 **申请**。宝塔会自动添加 TXT 记录 → 等待 CA 校验 → **自动签发并部署**。
9. 完成后页面显示「证书已部署」，结束。✅

> 优点：以后**自动续签**也全自动，不用每年手动加记录。

---

## 三、方式 B：手动 DNS（TXT 记录）验证

> 没有 API 密钥时用这个。缺点：下次续签要再手动加一次 TXT（除非改用 API）。

1. 网站 → `coolcoth.com` → **SSL** → **Let's Encrypt**。
2. 验证方式选 **DNS验证**。
3. 页面会列出**需要你手动添加的 DNS 记录**，一般是：
   - 记录类型：**TXT**
   - 主机记录：**`_acme-challenge`**（完整即 `_acme-challenge.coolcoth.com`）
   - 记录值：一长串字符（如 `S7ASyftFIXsmMfhFqydT7QfMsFpsmTXRLD7FMZd_AIY` 之类，以页面显示为准）
   - （如果要给 `www` 也签，会再给一条 `_acme-challenge.www` 的 TXT）
4. **另开一个标签页**，登录你的域名解析控制台
   （阿里云：域名 → 解析设置；腾讯云：DNS 解析；DNSPod / Namesilo 等同理）。
5. 添加上面那条 TXT 记录，保存。
6. **等解析生效**（看 TTL，通常 1–10 分钟；用下面命令自查）：
   ```bash
   nslookup -type=TXT _acme-challenge.coolcoth.com
   # 或 Windows:
   nslookup -type=TXT _acme-challenge.coolcoth.com 8.8.8.8
   ```
   看到记录值和你填的一致，说明生效。
7. 回到宝塔，点 **验证 / 申请**。CA 读到 TXT 后即签发并自动部署。

---

## 四、签发后必做

1. SSL 页确认证书状态为「已部署」，有效期约 90 天。
2. 开启 **强制 HTTPS**（SSL 页里有开关）→ 访问 `http://` 自动跳 `https://`。
3. 浏览器访问 `https://coolcoth.com/` 和 `https://www.coolcoth.com/`，确认：
   - 地址栏出现小锁 🔒
   - 前台页面、后台 `/admin` 都正常（之前配的 `try_files` 继续生效）
4. 跑部署收尾（若还没跑）：
   ```bash
   cd /www/wwwroot/coolcoth.com
   bash deploy.sh
   rm -rf install          # 删安装目录
   ```
   后台 → 设置 → 管理员，改掉默认密码 `admin888`。

---

## 五、自动续签

- **DNS API 方式**：宝塔默认会在计划任务里加 Let's Encrypt 自动续签，到期前自动换证，无需人工。
- **手动 DNS 方式**：续签时 TXT 记录值会变，需重新加一次（建议趁机切到 API 方式一劳永逸）。

---

## 六、常见坑

| 现象 | 原因 | 处理 |
|---|---|---|
| 申请一直转圈/超时 | API 密钥权限不对或填错 | 核对 AccessKey，只给 DNS 权限 |
| 手动 DNS 提示「记录未找到」 | TXT 还没生效 / 主机名填错 | `nslookup` 自查，确认是 `_acme-challenge` 而非 `@` |
| 证书有了但网站打不开 | 运行目录不是 `/public` 或伪静态丢了 | 按「一、4」补齐 |
| 浏览器红色「非安全」 | 页面里混用了 http 资源 | 后台/主题里图片、JS 改用相对或 https 地址 |
