内网 安全HTTPS 证书管理(Cloudflare API + Split DNS)
方案综述(针对内网HTTPS 访问提示证书不安全告警问题)
- 前提
vm.msfts.org是你内网想用的域名,需要对应到192.168.2.200内网IP。 - 核心问题 公有 CA(Let’s Encrypt)发证书必须能完成域名所有权验证(DNS-01 或 HTTP-01),且域名对应的 zone 必须在公网上被管理。 同时你访问时解析到的是内网 IP。
- 实现思路
- 方案 A:通过 Cloudflare DNS-01 申请 Let’s Encrypt 证书(公信),并内网 DNS 做 Split DNS 解析
你需要确保:
- 域名
msfts.org托管在 Cloudflare,且你有权限修改 DNS - 使用 Cloudflare API 申请证书,证书覆盖
vm.msfts.org - 公网 DNS 里不设置
vm.msfts.orgA 记录,或者设置为无效 IP - 内网 DNS 服务器(如公司AD DNS或Bind)把
vm.msfts.org解析到192.168.2.200 - ESXi 的 Web 服务部署这个证书(支持自定义 SSL)
- 域名
- 方案 B:自建内部 CA 签发证书,给内网所有客户端(浏览器)下发信任根证书
这是纯内网方案,无需公网参与,适合企业内网,步骤包括:
- 自建 CA(OpenSSL 或 AD CS)
- 生成包含
vm.msfts.org和内网 IP192.168.2.200的证书(SAN) - 部署证书到 ESXi
- 给所有内网客户端导入并信任 CA 根证书(通过组策略、MDM 或手动)
- 适用场景:
- 内网 ESXi 服务器、Web 应用、API 服务等 HTTPS 服务
- 纯内网 IP,域名通过内部 DNS 解析
- 目标:
- 浏览器访问不弹“证书不可信”或安全警告
- 内网 HTTPS 服务使用公信或自签证书,统一管理
一、前提条件(方案A)
- 必须拥有一个域名
- 例如:
msfts.org - 域名必须在你可控的 DNS 提供商处托管(Cloudflare、GoDaddy 等)
- 例如:
- Cloudflare 托管域名
- 域名在 Cloudflare 托管
- 能够添加 DNS 记录和 API Token
- 内网服务器
- ESXi / Web / API 服务器 IP 内网可访问
- 内网 DNS 可以做 Split DNS(内部域名解析到内网 IP)
二、Cloudflare API 设置
1. 登录 Cloudflare 并获取 API Token
- 登录 Cloudflare 控制台
- 进入 “My Profile -> API Tokens”
- 创建 API Token:
- 模板:Zone:DNS
- 权限:
- Zone:Read
- DNS:Edit
- 限制作用域到你的域名,例如
msfts.org
- 保存生成的 Token(例如
CLOUDFLARE_API_TOKEN)
2. 在申请机上保存凭证文件
mkdir -p ~/.secrets
cat > ~/.secrets/cloudflare.ini <<EOF
dns_cloudflare_api_token = CLOUDFLARE_API_TOKEN
EOF
chmod 600 ~/.secrets/cloudflare.ini
三、证书申请(公信 CA,Let’s Encrypt)
#### Ubuntu / Debian
sudo apt update
sudo apt install certbot -y
sudo apt install python3-certbot-dns-cloudflare -y
#### CentOS / RHEL
sudo yum install epel-release -y
sudo yum install certbot -y
sudo yum install python3-certbot-dns-cloudflare -y
####
which certbot && certbot --version
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
-d vm.msfts.org \
--key-type rsa \
--rsa-key-size 2048
- 成功后,证书保存在:
/etc/letsencrypt/live/vm.msfts.org/ - 文件包括:
privkey.pem(私钥)fullchain.pem(证书链)
四、内网 DNS 配置(Split DNS)
- 内网 DNS 添加 A 记录:
vm.msfts.org A 192.168.2.200
- 公网 DNS 可不设置或指向无效 IP
- 确认解析正确:
nslookup vm.msfts.org # 返回内网 IP 192.168.2.200
五、ESXi 证书部署
1. SHA256 校验证书与私钥匹配
openssl rsa -noout -modulus -in rui.key | openssl sha256
openssl x509 -noout -modulus -in rui.crt | openssl sha256
2. 上传证书到 ESXi
mv /etc/vmware/ssl/rui.crt /etc/vmware/ssl/rui.crt.bak
mv /etc/vmware/ssl/rui.key /etc/vmware/ssl/rui.key.bak
scp fullchain.pem root@192.168.2.200:/etc/vmware/ssl/rui.crt
scp privkey.pem root@192.168.2.200:/etc/vmware/ssl/rui.key
chmod 600 /etc/vmware/ssl/rui.*
chown root:root /etc/vmware/ssl/rui.*
3. 重启 ESXi 服务
/etc/init.d/hostd restart
/etc/init.d/vpxa restart
4. 验证
> curl -Ik https://vm.msfts.org
HTTP/1.1 200 OK
Date: Wed, 12 Nov 2025 10:11:25 GMT
Connection: Keep-Alive
Content-Security-Policy: upgrade-insecure-requests
Content-Type: text/html
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1
Content-Length: 258
> nslookup vm.msfts.org
Server: 192.168.2.1
Address: 192.168.2.1#53
Name: vm.msfts.org
Address: 192.168.2.200


六、其他局域网 HTTPS 应用部署思路
其他应用也是一样的思路,针对不同的应用需要生成不一样证书,再将证书放到应用的相对应的证书位置进行配置即可。
1. 部署示例
- Nginx:
server {
listen 443 ssl;
server_name web.lan.local;
ssl_certificate /etc/nginx/ssl/web.crt;
ssl_certificate_key /etc/nginx/ssl/web.key;
}
- Apache:
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/web.crt
SSLCertificateKeyFile /etc/httpd/ssl/web.key
- Tomcat:
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out server.pfx \
-name tomcat -password pass:changeit
修改 server.xml 使用 PKCS12 文件,重启 Tomcat。
七、统一管理与自动化建议
- 证书统一存储:
/etc/ssl/private/或/srv/certs/ - 权限控制:
chmod 600,chown root:root - 自动续期:
- 公信 CA 使用 Certbot
- 内网自签证书可写脚本生成并替换
- Split DNS 保证域名解析到内网 IP
九、参考文档
⚠️ 注意:
- 拥有域名是前提
- FIPS 模式禁止使用 MD5/SHA1
- Split DNS 是内网 HTTPS 部署关键