用 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-challenge | TXT | 那串随机值 | 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"
两个必须知道的坑
- 证书 90 天到期,手动 DNS 验证不会自动续期
certbot 明确提示:manual 方式需要 hook 脚本才能自动续。要么到期前手动重跑,要么备案通过后改用 HTTP-01 自动续期(--webroot + 定时任务)。
- 备案拦截是 SNI 层面的
域名没备案时,即使 HTTPS 证书装好了,腾讯云仍可能按 SNI 重置连接(我们的实测:部分线路可通、部分被重置)。备案通过后才会稳定,这不是证书配置问题。
小结
HTTPS 本身不难,难在验证方式和环境限制。记住三个点:验证方式按环境选(HTTP-01 / DNS-01)、证书要续期、域名合规是前提。
需要帮忙给服务器配 HTTPS、加安全加固的,可以找我。