NAT VPS 使用HTTPS加密
问题分析
Let’s Encrypt 等免费 SSL 证书签发机构在验证域名所有权时,通常有三种验证方式:
HTTP-01:通过 80/443 端口访问你的服务器,可以直接使用官方提供的程序一步到位;
TLS-ALPN-01:要求可访问 443 端口;
DNS-01:通过修改域名的 DNS 记录来验证。
然而我们的场景是:
服务器是 NAT 机器;
无法直通或已占用 443/80 端口;
有 Cloudflare 域名;
可通过端口映射(如 4432 → 443 或 3468 → 3468)访问。
→ 那么只能走 DNS 验证方式(DNS-01)。
使用 Cloudflare API 自动签发证书
1. 在 Cloudflare 控制台创建 API Token
登录 Cloudflare
进入 My Profile → API Tokens
点击 Create Token
选择模板 Edit zone DNS
权限:
Zone → DNS → Edit
Zone → Zone → Read
选择你要绑定好的域名
生成后保存 API Token
2. 在服务器安装 acme.sh
1 2
| curl https://get.acme.sh | sh source ~/.bashrc
|
设置好环境变量
1 2 3 4
| export CF_Token="你刚才保存的_API_Token" export CF_Account_ID="" export CF_Zone_ID="" export CF_Email=""
|
替换 CF_Token 即可,其他可以留空不填
3. 注册账户(ZeroSSL 要求)以及获取证书
执行一次
1
| ~/.acme.sh/acme.sh --register-account -m youremail@example.com
|
执行申请命令
1
| ~/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d 2.example.com
|
你可以单次申请多个证书,假设你购买了 example.com 这个域名,可以执行 -d example.com 获取根域名证书,也可以执行 -d 2.example.com 获取子域名证书。
如果一切正确,会出现:
1 2 3 4 5
| [Tue Oct 06 11:10:02 CST 2025] Adding TXT record: _acme-challenge.example.com [Tue Oct 06 11:10:03 CST 2025] Successfully added ...
[Tue Oct 06 11:12:03 CST 2025] Verify finished, cert is issued.
|
4. 安装证书到指定目录
假设你想放到 /root/cert 目录里
1 2 3 4
| mkdir -p /root/cert ~/.acme.sh/acme.sh --install-cert -d example.com \ --key-file /root/cert/private.key \ --fullchain-file /root/cert/cert.crt
|
此时你可以在一些网站面板添加证书路径
1 2
| /root/cert/private.key /root/cert/cert.crt
|
在 Cloudflare 控制台 → DNS → 添加 A 记录:
1 2 3
| | 类型 | 名称 | 值(IPv4 地址) | 代理状态 | | -- | ----- -| ----------------| ------------- | | A | `@` | `nat ip地址` | **灰色云(仅DNS)** |
|
如果是子域名,假设 2.example.com ,把 @ 改成 2 即可
移除证书:
执行
1
| ~/.acme.sh/acme.sh --remove -d clazys.qzz.io
|
之后在Cloudflare里删除dns记录
无法手动设置证书网站面板使用HTTPS加密
这里以Komari监控面板举例,我们需要使用 Cloudflare Tunnel ,适合Cloudflare 允许的标准 HTTPS 端口(443, 2053, 2083, 2087, 2096, 8443)全被禁止或占用
1. 安装Cloudflared
1 2
| curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared chmod +x /usr/local/bin/cloudflared
|
2. 登录Cloudflare并创建隧道
1 2
| cloudflared tunnel login cloudflared tunnel create komari
|
在此之前,建议使用浏览器先提前登录好Cloudflare
这会生成一个类似 /root/.cloudflared/komari.json 的凭证文件 (可能是uuid替代了 komari 字样 ,类似于 /root/.cloudflared/cdd1aaaa-aaaa-bbbb-cccc-cf1ddddd450.json
3. 配置转发规则
编辑 /root/.cloudflared/config.yml:
1 2 3 4 5 6 7 8
| tunnel: komari credentials-file: /root/.cloudflared/komari.json
ingress: - hostname: probe.yourdomain.com service: http://localhost:3000 - service: http_status:404
|
4. 建立Cloudflare DNS路由
1
| cloudflared tunnel route dns komari komari.yourdomain.com
|
其中 yourdomain.com 是你购买的根域名,komari. 是新申请的子域名, 域名前面的 komari 是DNS配置名字
这会在 Cloudflare 自动添加一条 CNAME 记录指向隧道
5. 启动隧道
1
| cloudflared tunnel run komari
|
将cloudflared加入systemd:
1
| cloudflared service install
|
如果你的NAT VPS不支持这条命令,手写配置文件:
1
| nano /etc/systemd/system/cloudflared.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [Unit] Description=Cloudflare Tunnel for komari After=network.target
[Service] Type=simple User=root
ExecStart=/usr/local/bin/cloudflared tunnel run --config /root/.cloudflared/config.yaml Restart=on-failure RestartSec=5s
StandardOutput=journal StandardError=journal
[Install] WantedBy=multi-user.target
|
现在访问
1
| https://komari.yourdomain.com
|
你将看到你的网站,并且带上HTTPS证书,
删除隧道
1
| cloudflared tunnel delete komari
|
之后手动在DNS记录中删除相对应的CNAME记录,名字应该是 komari
