2026-10-26 · HTTPS / Nginx / 证书

用 Let's Encrypt 给 Nginx 配 HTTPS:DNS 验证实战

给网站上 HTTPS 看起来复杂,其实核心就三步:申请证书 → 配 Nginx → 验证。难的是各种边界情况——比如我这次遇到的"域名未备案,HTTP 验证走不通"。

先搞清楚:为什么用 DNS 验证

Let's Encrypt 常见的验证方式有两种:

  • HTTP-01:在网站根目录放一个验证文件,CA 来访问 http://域名/.well-known/acme-challenge/xxx 检查
  • DNS-01:在 DNS 里加一条 TXT 记录,CA 查 DNS 来验证

正常情况下 HTTP-01 最简单,还能全自动续期。但如果你和我一样:域名还在备案审核中,国内对未备案域名的 80 端口访问会被拦截——CA 的验证请求根本到不了你的服务器,HTTP-01 必然失败。

这时候就用 DNS-01:验证走 DNS,不经过 HTTP,不受备案拦截影响。

第一步:安装 certbot

apt-get update
apt-get install -y certbot
certbot --version

第二步:发起 DNS 手动验证

certbot certonly --manual --preferred-challenges dns \
  --agree-tos -m 你的邮箱@example.com \
  -d www.example.com -d example.com

它会提示你添加一条 TXT 记录,例如:

Please deploy a DNS TXT record under the name:
_acme-challenge.example.com.
with the following value:
9fMtUPMgdejgbPJrRkhWzLvEm1wdO_IRwaNce9aw2PI

去你的 DNS 服务商(我这里是腾讯云 DNSPod)添加记录:

主机记录 类型 记录值 TTL
_acme-challengeTXT那串随机值600

如果有多个域名(www 和根域名),certbot 会依次要你加多条 TXT,一条都别删。加完回终端按回车,它就会去验证并签发。

第三步:配置 Nginx 443

签发的证书一般在 /etc/letsencrypt/live/你的域名/ 下。Nginx 加一个 server 块:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com example.com;

    ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    root /var/www/example;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

nginx -t 校验通过后 systemctl reload nginx。

第四步:验证

# 证书信息
openssl x509 -in /etc/letsencrypt/live/www.example.com/fullchain.pem \
  -noout -subject -issuer -dates

# 本机访问
curl -sk https://127.0.0.1/ -o /dev/null -w "%{http_code}\n"

# 指定解析测试域名
curl -sk --resolve www.example.com:443:你的服务器IP \
  https://www.example.com/ -o /dev/null -w "%{http_code}\n"

两个必须知道的坑

  1. 证书 90 天到期,手动 DNS 验证不会自动续期

certbot 明确提示:manual 方式需要 hook 脚本才能自动续。要么到期前手动重跑,要么备案通过后改用 HTTP-01 自动续期(--webroot + 定时任务)。

  1. 备案拦截是 SNI 层面的

域名没备案时,即使 HTTPS 证书装好了,腾讯云仍可能按 SNI 重置连接(我们的实测:部分线路可通、部分被重置)。备案通过后才会稳定,这不是证书配置问题。

小结

HTTPS 本身不难,难在验证方式和环境限制。记住三个点:验证方式按环境选(HTTP-01 / DNS-01)、证书要续期、域名合规是前提。

需要帮忙给服务器配 HTTPS、加安全加固的,可以找我。