HTTPS 部署实战:未备案域名 + 非标端口的完整方案

背景

服务器上跑了个监控大屏,想加 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(三层都要)

  1. 服务器 ufw
bash 复制代码
sudo ufw allow 8443/tcp
  1. 腾讯云安全组

控制台加一条:TCP 8443 放行所有 IP。

  1. 验证
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 就能上线。

外加一个生活趣事:昨天和朋友骑共享单车出门,去探索没去过的地方。路上经过一座很长的桥,桥上风特别凉快;上坡蹬得腿软,下坡爽到飞起。结果返程时导航导错了,我们来回折腾,硬生生爬了四次桥,直接累麻了。现在一看到桥,就条件反射想起昨天的经历😂 有和我一样经历的朋友吗?欢迎来评论区聊聊!

相关推荐
jackletter1 小时前
linux:安装 ubuntu 26.04.1
linux·ubuntu·ubuntu26.04.1
2401_869769591 小时前
make 进度条
linux
YYRAN_ZZU3 小时前
如何编一个gcc的交叉工具链
linux·c++
shjita3 小时前
centos中安装docker
linux·docker·centos
程序猿老A3 小时前
阿里云linux服务器安装mysql并实现远程访问
linux·服务器·阿里云
wuminyu3 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
M78佐菲4 小时前
ARM学习笔记(9)
linux·arm开发·笔记·嵌入式硬件·学习
赵民勇4 小时前
glib-compile-schemas命令详解
linux·运维
小小、码农4 小时前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统