NAT VPS使用 HTTPS 加密网站

NAT VPS 使用HTTPS加密

问题分析

Let’s Encrypt 等免费 SSL 证书签发机构在验证域名所有权时,通常有三种验证方式:

  1. HTTP-01:通过 80/443 端口访问你的服务器,可以直接使用官方提供的程序一步到位;

  2. TLS-ALPN-01:要求可访问 443 端口;

  3. DNS-01:通过修改域名的 DNS 记录来验证。

然而我们的场景是:

  1. 服务器是 NAT 机器;

  2. 无法直通或已占用 443/80 端口;

  3. 有 Cloudflare 域名;

  4. 可通过端口映射(如 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
# credentials-file: /root/.cloudflared/cdd1aaaa-aaaa-bbbb-cccc-cf1ddddd450.json # 如果你是uuid为名字的配置文件

ingress:
- hostname: probe.yourdomain.com
service: http://localhost:3000 # 你的Komari控制面板或其他面板监听的端口替代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
# 指定 cloudflared 可执行文件路径
ExecStart=/usr/local/bin/cloudflared tunnel run --config /root/.cloudflared/config.yaml
Restart=on-failure
RestartSec=5s
# 日志输出到 systemd journal
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

现在访问

1
https://komari.yourdomain.com

你将看到你的网站,并且带上HTTPS证书,

删除隧道

1
cloudflared tunnel delete komari

之后手动在DNS记录中删除相对应的CNAME记录,名字应该是 komari


GPLv3 License


NAT VPS使用 HTTPS 加密网站
https://blog.clazys.qzz.io/2025/12/06/natvpsssl/
作者
Clazys
发布于
2025年12月6日
许可协议