# wanyue.online HTTPS 配置方式整理

## 一、这次最终采用的方式

昨天最终跑通的不是 `certbot --nginx` 的标准 HTTP-01 流程，而是：

- **证书签发方式：Let’s Encrypt + Certbot 手动 DNS-01 验证**
- **Web 服务：Nginx**
- **最终效果：80 端口统一跳转到 443，站点与 `/files/` 都走 HTTPS**

这套方式适合当时那种环境：

- 域名解析、网络路径、代理/透明代理情况比较复杂
- `HTTP-01` 容易因为 80 端口入站验证失败
- 但 DNS 控制权在手里，可以手工添加 TXT 记录

---

## 二、为什么没有直接用 `certbot --nginx`

标准方式通常是：

```bash
certbot --nginx -d wanyue.online
```

它的优点是：

- 自动申请证书
- 自动改 Nginx 配置
- 自动配置跳转

但它依赖 **HTTP-01 验证**，核心要求是：

- Let’s Encrypt 能从公网访问 `http://wanyue.online/.well-known/acme-challenge/...`
- 也就是 **80 端口必须稳定可达**

昨天排查里，这条链路不够稳，所以最终改成了 **DNS-01**。

---

## 三、昨天真正成功的签发方式

### 1. 使用 Certbot 手动 DNS 验证

实际思路是：

```bash
certbot certonly --manual --preferred-challenges dns -d wanyue.online
```

在旧版 Certbot 环境下，为了先拿到 TXT challenge，一般会用类似方式：

```bash
printf 'Y\n' | certbot certonly \
  --manual \
  --preferred-challenges dns \
  -d wanyue.online \
  --agree-tos \
  --register-unsafely-without-email 2>&1
```

### 2. 在 DNS 控制台新增 TXT 记录

Certbot 会给出一条验证信息，需要在 DNS 平台添加：

- **主机记录**：`_acme-challenge`
- **记录类型**：`TXT`
- **记录值**：Certbot 输出的 challenge token

也就是：

```text
_acme-challenge.wanyue.online  TXT  <challenge-token>
```

### 3. 等 TXT 生效后完成签发

CA 查询到 TXT 记录正确后，就会签发证书。

---

## 四、为什么 DNS-01 更适合这次环境

DNS-01 只验证一件事：

> 你是否真正控制 `wanyue.online` 这个域名的 DNS

它**不依赖**下面这些条件：

- Nginx 的 challenge 路由是否暴露正确
- 80 端口是否稳定对公网开放
- 443 是否已提前配好
- 网站转发链路是否有代理、透明代理、WAF 干扰

所以在昨天的环境里，DNS-01 比 HTTP-01 更稳。

---

## 五、当前机器上已经确认到的实际 HTTPS 配置

### 1. 当前 Nginx 站点配置文件

已确认当前站点配置在：

```text
/etc/nginx/sites-available/blog
```

### 2. 当前 Nginx 的关键 HTTPS 配置

当前配置核心内容如下：

```nginx
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name wanyue.online 47.98.55.249 _;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name wanyue.online 47.98.55.249 _;

    ssl_certificate /etc/letsencrypt/live/wanyue.online/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/wanyue.online/privkey.pem;

    client_max_body_size 50m;

    location = /files {
        return 301 /files/;
    }

    location /files/download/ {
        proxy_pass http://127.0.0.1:8091/download/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /files/ {
        proxy_pass http://127.0.0.1:8091/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}
```

### 3. 配置含义

这段配置说明：

- `80` 端口统一跳转到 `https://$host$request_uri`
- `443` 端口负责真正的 HTTPS 服务
- 证书文件使用的是：
  - `/etc/letsencrypt/live/wanyue.online/fullchain.pem`
  - `/etc/letsencrypt/live/wanyue.online/privkey.pem`
- `/` 反代到 Halo：`127.0.0.1:8090`
- `/files/` 反代到文件服务：`127.0.0.1:8091`

也就是说，现在 HTTPS 不只是博客首页在用，`/files/` 也已经一起纳入了同一个 HTTPS 站点。

---

## 六、当前证书续期方式也已经能看出来

从当前续期配置文件可确认：

```text
/etc/letsencrypt/renewal/wanyue.online.conf
```

其关键参数为：

```ini
version = 0.40.0
pref_challs = dns-01,
authenticator = manual
manual_public_ip_logging_ok = True
```

这说明当前这张证书是：

- **手动模式**
- **DNS-01 验证**
- **旧版 Certbot（0.40.0）签出的**

---

## 七、这套方案的优缺点

### 优点

- 对复杂网络环境更稳
- 不依赖 80 端口 challenge 文件回源成功
- 适合有代理、透明代理、复杂转发场景
- 适合后续做通配符证书

### 缺点

- 目前是 **manual + dns-01**
- **默认不能像普通 HTTP-01 那样无感自动续期**
- 证书到期前，大概率仍需要再次手工添加 TXT 记录

---

## 八、后续如果要做得更省心，推荐升级成自动 DNS 续期

推荐方向：

### 方案 A：DNS API 自动化

如果域名 DNS 服务商支持 API，可以改成：

- Certbot + DNS 插件
- 或 `acme.sh + DNS API`

例如阿里云 DNS，可以通过 API 自动写入 `_acme-challenge` TXT 记录，这样就能做到：

- 自动验证
- 自动续期
- 到期前无需再手工登录 DNS 面板

### 方案 B：若网络环境恢复简单稳定，再尝试 HTTP-01

如果以后确认：

- 80 端口公网稳定可达
- 没有透明代理干扰
- 没有异常转发链路

也可以重新改回标准方式：

```bash
certbot --nginx -d wanyue.online
```

但就昨天的实际情况看，**DNS-01 更适合作为稳定方案**。

---

## 九、最简结论

昨天整理并最终成功落地的 HTTPS 配置方式，可以一句话概括为：

> **先用 Certbot 的手动 DNS-01 方式为 `wanyue.online` 申请 Let’s Encrypt 证书，再把证书挂到 Nginx 的 443 server 中，并将 80 端口统一 301 跳转到 HTTPS。**

当前实际落地状态是：

- 域名：`wanyue.online`
- Nginx 配置文件：`/etc/nginx/sites-available/blog`
- 证书路径：`/etc/letsencrypt/live/wanyue.online/`
- HTTP → HTTPS：已启用
- 根路径 `/`：反代 Halo
- `/files/`：反代文件服务
- 续期方式：**manual + DNS-01**

---

## 十、可直接复用的简版操作模板

```bash
# 1) 申请证书（手动 DNS-01）
certbot certonly --manual --preferred-challenges dns -d wanyue.online

# 2) 按提示去 DNS 控制台添加：
# _acme-challenge.wanyue.online TXT <challenge-token>

# 3) 证书签发后，在 Nginx 中配置：
# ssl_certificate /etc/letsencrypt/live/wanyue.online/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/wanyue.online/privkey.pem;

# 4) 配置 80 跳转到 443
# return 301 https://$host$request_uri;

# 5) 检查并重载 Nginx
nginx -t && systemctl reload nginx
```
