一、这次最终采用的方式
昨天最终跑通的不是 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>&12. 在 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/blog2. 当前 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_uri443端口负责真正的 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.onlineNginx 配置文件:
/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