背景
服务器上跑了个监控大屏,想加 HTTPS。但域名是 .asia 后缀,无法在大陆备案。用标准 443 端口会被腾讯云拦截。
只能走非标端口 + DNS 验证的路子。
原因
为什么要用非标端口?
大陆服务器 + 未备案域名,走 80/443 会被云平台拦截。但换成 8443,就绕过了这个限制。
为什么要用 DNS-01 验证?
Let's Encrypt 申请证书时,需要验证"域名是你的"。两种方式:
| 验证方式 | 原理 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| HTTP-01 | 在域名下放一个临时文件,CA 通过 HTTP 访问验证 | 80 端口可访问、域名已备案 | 配置简单,无需额外操作 | 必须开放 80 端口,未备案域名会被拦截 |
| DNS-01 | 在 DNS 记录中添加 TXT 记录,CA 通过查询 DNS 验证 | 未备案域名、非标端口、无 80 端口 | 不依赖 80/443 端口,适合未备案域名 | 需要 DNS 服务商 API 支持,配置稍复杂 |
未备案域名 80 端口走不通,只能用 DNS-01。
解决 第一步:DNS 解析 在 DNSPod 加两条记录:
| 主机记录 | 类型 | 值 |
|---|---|---|
| @ | A | YOUR_SERVER_IP |
| _acme-challenge | TXT | (Certbot 会告诉你填什么) |
nslookup YOUR_DOMAIN
css
sudo apt install certbot -y
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d YOUR_DOMAIN
按提示操作:
输入邮箱 → Y
分享给 EFF → N
记录 IP → Y
Certbot 打印一个 TXT 值,先别按回车
把那个 TXT 值填到 DNSPod,新开一个终端验证:
ini
nslookup -type=TXT _acme-challenge.YOUR_DOMAIN
回原终端按回车。看到这段就成功:
bash
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem
css
server {
listen 8443 ssl;
http2 on;
server_name YOUR_DOMAIN;
ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用 + 检查 + 重启:
bash
sudo ln -s /etc/nginx/sites-available/https /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
第四步:放行 8443(三层都要)
- 服务器 ufw
bash
sudo ufw allow 8443/tcp
- 腾讯云安全组
控制台加一条:TCP 8443 放行所有 IP。
- 验证
bash
sudo ss -tlnp | grep 8443 # 有监听
curl -Ik https://YOUR_DOMAIN:8443 # HTTP/2 200
浏览器访问 https://YOUR_DOMAIN:8443 → 出现锁头。 三个坑 坑 1:DNS TXT 记录主机记录填错
DNSPod 里主机记录只填 _acme-challenge,不要填 _acme-challenge.YOUR_DOMAIN。后者会被拼成 _acme-challenge.YOUR_DOMAIN.YOUR_DOMAIN,永远验证失败。
坑 2:TXT 没生效就按回车
一定要新开终端用 nslookup -type=TXT 确认。DNS 缓存 10-60 秒生效,急不得。
坑 3:只放行了云安全组,忘了 ufw
三层防火墙:Nginx 监听 → 服务器 ufw → 云平台安全组。任何一层没通,外部就访问不了。
排查顺序:
bash
# 1. Nginx 有没有监听
sudo ss -tlnp | grep 8443
# 2. 服务器本地能否访问
curl -Ik https://127.0.0.1:8443
# 3. 服务器 ufw 放行了吗
sudo ufw status | grep 8443
# 4. 云平台安全组放行了吗(控制台检查)
未备案域名走 443 会被拦,但 8443 可以。 加 DNS-01 验证 + 三层放行,HTTPS 就能上线。
外加一个生活趣事:昨天和朋友骑共享单车出门,去探索没去过的地方。路上经过一座很长的桥,桥上风特别凉快;上坡蹬得腿软,下坡爽到飞起。结果返程时导航导错了,我们来回折腾,硬生生爬了四次桥,直接累麻了。现在一看到桥,就条件反射想起昨天的经历😂 有和我一样经历的朋友吗?欢迎来评论区聊聊!