前言
玩过 VPS 的朋友都知道,很多性价比极高的 NAT 小鸡(NAT VPS)虽然价格便宜、线路优秀,但它最大的痛点在于没有独立的公网 IP,更没有 80 和 443 端口的完整权限。
如果你想在 NAT 机子上部署一个安全的网站或者服务,传统的 SSL 证书申请方法(如基于 HTTP-01 验证的 acme.sh 配合 Nginx)往往会直接卡死在 80 端口被占用的报错上。
今天这篇文章,我就带大家从头开始:从 VPS 购买、域名购买,到如何利用 acme.sh 的 DNS 验证模式 完美绕过 80/443 端口限制,轻松搞定 HTTPS 证书!
一、 基础准备:VPS 与域名购买
在开始配置之前,我们需要准备好两样东西:一台 NAT VPS 和一个属于你自己的顶级域名。
1.1 VPS 购买与注意事项
选择建议:购买 NAT VPS 时,注意查看商家提供的端口映射规则。通常商家会分配给你几个特定的外部端口用于 SSH 连接。
系统环境:推荐安装干净的 Debian 11/12 或 Ubuntu 22.04 系统。
1.2 域名购买与 DNS 解析托管
购买平台:你可以选择 Namesilo、Porkbun、Cloudflare 或国内的腾讯云/阿里云购买便宜的域名。
关键步骤:为了方便后续使用 API 自动完成 DNS 验证,强烈建议将域名的 DNS 解析托管到 Cloudflare(免费且支持强大的 API 管理)。
二、 痛点解析:为什么传统 HTTP 验证在 NAT 机上行不通?
在深入教程前,我们先看一眼痛点:
传统方式(HTTP-01):CA 机构(如 Let’s Encrypt)会向你的服务器发送一个 HTTP 请求,必须通过你服务器的 80 端口 来验证域名归属。
NAT 机的困境:NAT VPS 的 80/443 端口通常被母机占用,或者根本不对外开放。因此,配置 Nginx 监听 80 端口去跑验证这条路在 NAT 机上直接被堵死了。
三、 核心绝招:使用 acme.sh 的 DNS 验证完美破局
既然我们无法通过端口让外界访问我们的服务器,那能不能“证明”这个域名归我们所有呢?可以!通过在域名的 DNS 服务商那里添加一条 TXT 解析记录来证明。
为了避免每次手动去后台加记录的繁琐,我们使用 acme.sh 脚本配合 Cloudflare 的 API Key 实现全自动 DNS 验证。
3.1 在 NAT 机上安装 acme.sh
登录你的 NAT VPS,依次执行以下命令安装 acme.sh(请将邮箱替换为你自己的):
# 安装 acme.sh
curl https://get.acme.sh | sh -s [email protected]
# 让环境变量生效
source ~/.bashrc
3.2 配置 Cloudflare API 密钥
登录你的 Cloudflare 账号,在个人资料页面生成一个具有 Zone DNS (编辑) 权限的 API Token。
在终端中将 Token 和账号信息写入环境变量:
export CF_Token="你的Cloudflare_API_Token"
export CF_Account_ID="你的Cloudflare_Account_ID"
3.3 申请并签发证书(避开 80 端口的魔法时刻)
万事俱备,现在我们可以直接通过 DNS 模式申请证书了,全程不需要开启任何 Nginx,也不需要占用 80 端口:
acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com
执行后,acme.sh 会自动通过 Cloudflare API 临时添加一个 TXT 解析,验证通过后会自动删除,安全又优雅!
四、 安装证书到指定目录
证书签发成功后,我们需要将其安装到你项目或反向代理(如 Nginx、Caddy、Xray 等)能够读取的目录中:
acme.sh --install-cert -d yourdomain.com \
--key-file /root/cert/yourdomain.key \
--fullchain-file /root/cert/yourdomain.cer \
--reloadcmd "echo 'Certificate updated successfully!'"
总结
通过 acme.sh 的 DNS 验证模式,我们完美绕过了 NAT VPS 没有公网 IP、没有 80/443 端口权限的致命缺陷。不仅如此,acme.sh 还自带了自动续期功能,一劳永逸。
希望这篇教程能帮各位 NAT 玩家顺利搭好自己的服务!如果你在配置过程中遇到问题,欢迎在评论区留言交流。