HTTPS 配置方式整理

_

一、这次最终采用的方式

昨天最终跑通的不是 certbot --nginx 的标准 HTTP-01 流程,而是:

  • 证书签发方式:Let’s Encrypt + Certbot 手动 DNS-01 验证

  • Web 服务:Nginx

  • 最终效果:80 端口统一跳转到 443,站点与 /files/ 都走 HTTPS

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

  • 域名解析、网络路径、代理/透明代理情况比较复杂

  • HTTP-01 容易因为 80 端口入站验证失败

  • 但 DNS 控制权在手里,可以手工添加 TXT 记录


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

标准方式通常是:

certbot --nginx -d wanyue.online

它的优点是:

  • 自动申请证书

  • 自动改 Nginx 配置

  • 自动配置跳转

但它依赖 HTTP-01 验证,核心要求是:

  • Let’s Encrypt 能从公网访问 http://wanyue.online/.well-known/acme-challenge/...

  • 也就是 80 端口必须稳定可达

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


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

1. 使用 Certbot 手动 DNS 验证

实际思路是:

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

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

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

也就是:

_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 站点配置文件

已确认当前站点配置在:

/etc/nginx/sites-available/blog

2. 当前 Nginx 的关键 HTTPS 配置

当前配置核心内容如下:

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 站点。


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

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

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

其关键参数为:

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 端口公网稳定可达

  • 没有透明代理干扰

  • 没有异常转发链路

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

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


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

# 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

Ubuntu 20.04 手动安装 v2rayA & Xray 实现全系统代理教程 2026-04-20

评论区