内网 IP 的 HTTPS 常因自签证书或 SAN 缺失而报连接不是私密连接,公网 CA 又禁止为私网地址签证书。实测用 Proxmox VE 自带内部根 CA,为 PVE、OpenWrt LuCI、AdGuard Home 和爱快签发含内网 IP 的证书,Windows 导入一次根 CA 后各面板即绿锁。
浏览器访问 https://192.168.11.100、https://192.168.11.253 这些内网地址时永远飘红”您的连接不是私密连接”?公网 CA 根本不给内网 IP 签证书。本文用 PVE 自带的内部根 CA 一签到底:PVE、OpenWrt LuCI、AdGuard Home 面板、爱快主路由全部绿锁,只需导入一次根 CA。所有命令在真实家用网络实测过。
适用环境:Proxmox VE 8/9 · OpenWrt 24.10 · AdGuard Home v0.107.x · 爱快 3.7+ · Windows 11(Firefox 需单独导入)。
〇、为什么飘红 & 方案原理
飘红的真正原因
浏览器对 https://192.168.x.x 报”连接不是私密连接”,通常是两个原因之一(或叠加):
| 错误 | 原因 | 本文对应解法 |
|---|---|---|
ERR_CERT_AUTHORITY_INVALID |
设备用的是自签/内部 CA 证书,而你的电脑不认识这个 CA | 把内部根 CA 导入系统受信任根(第 2 步) |
ERR_CERT_COMMON_NAME_INVALID |
证书里没写你访问的这个 IP(SAN 缺失)——哪怕证书本身是真 CA 签的也一样红 | 重新签一张 SAN 含内网 IP 的证书(第 1、3 步) |
此路不通:想找 Let’s Encrypt / 阿里云等公网 CA 给 192.168.11.1 签证书?签不了。CA/Browser Forum 行业规范禁止对 RFC1918 私网地址签发证书。给内网 IP 上绿锁只有一条正路:自建内部 CA。
方案全景:一枚根 CA 管全家
Proxmox VE 安装时就自动生成了一套内部 CA(根证书 pve-root-ca + 私钥,有效期约 10 年)。直接拿它当全家的信任锚:给每台设备签一张”含自己 IP”的叶子证书,电脑导入这枚根——从此所有内网地址全部绿锁。
顺带纠正一个常见误区:证书飘红 ≠ 网站不安全,飘红只说明”你无法验证对方身份”。内网自建 CA 后加了密、验了身份,是真正的提升。
一、环境与前置条件
本教程在一台真实家用网络上完成,拓扑如下。IP 不同没关系,把命令里的 IP 换成你的即可。
| 设备 | IP | 系统 | 要上证书的服务 |
|---|---|---|---|
| 爱快主路由 | 192.168.11.1 | iKuai 3.7+ | Web 管理页(443) |
| PVE 宿主机 | 192.168.11.100 | Proxmox VE | Web 管理页(8006,自带根 CA) |
| OpenWrt 旁路由 | 192.168.11.253 | OpenWrt 24.10 | LuCI(443)+ AdGuard Home 面板(3443) |
| 你的电脑 | 192.168.11.200 | Windows 11 | 导入根 CA 的机器 |
前置要求:
- 你的电脑能 SSH 密钥登录 PVE(
ssh root@192.168.11.100免密); - PVE 与 OpenWrt 之间可互传文件(本教程用你的电脑做中转);
- 懂一点
openssl基本命令即可,所有命令可直接复制。
第 1 步 · 修 hosts + 重签 PVE 自身证书
PVE 自签证书的 SAN 以 /etc/hosts 为准。改过 IP 的机器,hosts 没同步就是飘红元凶。
1.1 检查三样东西
cat /etc/hosts # 看 hosts 里写的 IP
ip -4 addr show | grep inet | grep -v 127.0.0.1 # 看网卡实际 IP
openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -text | grep -A1 Alternative
# 看证书 SAN 里有没有"IP Address:你的实际IP"
本教程真机当时的状态:网卡是 192.168.11.100,hosts 和证书里却都还是老 IP 192.168.11.10——这就是飘红的根源(顺带:hosts 不同步也会导致各种服务解析异常,必须修)。
1.2 修复 hosts 并重新生成证书
# 备份 hosts,把老 IP 改成实际 IP(按你的实际情况替换 11.10 → 11.100)
cp /etc/hosts /root/hosts.bak.$(date +%Y%m%d)
sed -i 's/^192.168.11.10 /192.168.11.100 /' /etc/hosts
# 备份并重新生成节点自签证书
cp /etc/pve/local/pve-ssl.pem /root/pve-ssl.pem.bak.$(date +%Y%m%d)
cp /etc/pve/local/pve-ssl.key /root/pve-ssl.key.bak.$(date +%Y%m%d)
rm -f /etc/pve/local/pve-ssl.pem /etc/pve/local/pve-ssl.key
pvecm updatecerts --force
# 验证新证书的 SAN 已含当前 IP
openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -text | grep -A1 Alternative
systemctl restart pveproxy
三个实测踩过的坑:
① 老命令 pvecertgen 在新版 PVE 不存在,正确做法就是”删证书 + pvecm updatecerts --force“;
② updatecerts --force 可能提示覆盖 /root/.ssh/id_rsa——非交互终端下回车跳过即可,执行后用 ls -la /root/.ssh/id_rsa 确认修改时间没变;
③ SAN 的来源就是 /etc/hosts,hosts 不改,重签一百次也还是老 IP。
1.3 验证证书链
openssl verify -CAfile /etc/pve/pve-root-ca.pem /etc/pve/local/pve-ssl.pem
# 期望输出:/etc/pve/local/pve-ssl.pem: OK

第 2 步 · 下载根 CA 并导入 Windows
这是”一次导入、全家绿锁”的那一步。
scp root@192.168.11.100:/etc/pve/pve-root-ca.pem C:/Users/你的用户名/Desktop/pve-root-ca.cer
然后双击桌面的 pve-root-ca.cer:
- 双击 .cer 文件 → 证书信息 → 安装证书
- 存储位置选「当前用户」→ 下一步
- 选「将所有的证书都放入下列存储」→ 浏览 → 受信任的根证书颁发机构
- 下一步 → 完成 → 弹出安全警告点「是」
完成标志:Chrome / Edge 访问 https://192.168.11.100:8006 直接绿锁(PVE 自签证书已被根 CA 背书)。Chrome/Edge 完全退出再开一次才会刷新。
第 3 步 · 给 OpenWrt 签证书并挂到 LuCI
OpenWrt 的 LuCI(uhttpd)和 AdGuard Home 共用一张证书。注意 CA 私钥的路径。
3.1 在 PVE 上签发(CA 私钥在 /etc/pve/priv/ 下)
mkdir -p /root/253cert && cd /root/253cert
# SAN 按需修改:这里同时覆盖 IP 访问和域名访问
printf "subjectAltName=IP:192.168.11.253,DNS:a.997wan.comnkeyUsage=digitalSignature,keyEnciphermentnextendedKeyUsage=serverAuthn" > san.cnf
# 生成私钥和 CSR
openssl req -new -newkey rsa:2048 -nodes -keyout openwrt.key -subj "/CN=192.168.11.253" -out openwrt.csr
# 用 PVE 根 CA 签发(私钥路径是 /etc/pve/priv/pve-root-ca.key,不是 /etc/pve/ 下那个)
openssl x509 -req -in openwrt.csr -CA /etc/pve/pve-root-ca.pem
-CAkey /etc/pve/priv/pve-root-ca.key -CAcreateserial
-days 3000 -sha256 -extfile san.cnf -out openwrt.crt
# 验证
openssl verify -CAfile /etc/pve/pve-root-ca.pem openwrt.crt # 期望 OK
踩坑记录:根 CA 私钥不在 /etc/pve/pve-root-ca.key(那里只有公钥),真实位置是 /etc/pve/priv/pve-root-ca.key。用 find /etc/pve -name "*.key" 可确认。
3.2 经你的电脑中转到 OpenWrt
scp root@192.168.11.100:/root/253cert/openwrt.crt .
scp root@192.168.11.100:/root/253cert/openwrt.key .
scp root@192.168.11.100:/etc/pve/pve-root-ca.pem ca.pem
scp openwrt.crt root@192.168.11.253:/etc/certs/lan253.crt
scp openwrt.key root@192.168.11.253:/etc/certs/lan253.key
scp ca.pem root@192.168.11.253:/etc/certs/lan-ca.pem # 留在路由器上做验证用
md5sum openwrt.crt openwrt.key # 和路由器上 md5sum 对比确保没传坏
3.3 切换 uhttpd 并验证
chmod 600 /etc/certs/lan253.key
uci show uhttpd.main | grep -E "cert|key" > /root/uhttpd-cert-rollback.txt # 备份回滚信息
uci set uhttpd.main.cert='/etc/certs/lan253.crt'
uci set uhttpd.main.key='/etc/certs/lan253.key'
uci commit uhttpd
/etc/init.d/uhttpd restart
# 验证:IP 和域名两种访问都应 200
curl -s --cacert /etc/certs/lan-ca.pem -o /dev/null -w '%{http_code}n' https://192.168.11.253/
curl -s --cacert /etc/certs/lan-ca.pem --resolve a.997wan.com:443:192.168.11.253
-o /dev/null -w '%{http_code}n' https://a.997wan.com/
第 4 步 · AdGuard Home 面板开启 HTTPS
AGH v0.107.x 对证书有个硬要求:SAN 必须含 IP 地址——我们第 3 步的证书恰好满足,正好用它。
4.1 修改 tls 配置段
编辑 /etc/AdGuardHome.yaml,把顶层 tls: 段改成:
tls:
enabled: true
server_name: ""
force_https: true # http://IP:3000 自动跳转到 3443
port_https: 3443 # 443 已被 uhttpd 占用,选 3443
port_dns_over_tls: 0 # 不需要 DoT/DoQ,关掉
port_dns_over_quic: 0
port_dnscrypt: 0
dnscrypt_config_file: ""
allow_unencrypted_doh: false
certificate_chain: ""
private_key: ""
certificate_path: /etc/certs/lan253.crt # 用文件路径,证书更新自动重载
private_key_path: /etc/certs/lan253.key
strict_sni_check: false
cp /etc/AdGuardHome.yaml /etc/AdGuardHome.yaml.bak.tls-$(date +%Y%m%d) # 先备份!
vi /etc/AdGuardHome.yaml # 按 4.1 修改
/etc/init.d/AdGuardHome restart && sleep 5 && pidof AdGuardHome
# 验证:3000 应 307 跳到 3443,3443 应正常响应
curl -s -o /dev/null -w '%{http_code} %{redirect_url}n' http://192.168.11.253:3000/login.html
# 期望:307 https://192.168.11.253:3443/login.html
curl -s --cacert /etc/certs/lan-ca.pem -o /dev/null -w '%{http_code}n' https://192.168.11.253:3443/
重要回顾:AGH 曾用域名证书报 certificates has no IP addresses 拒绝启动——这是 v0.107.79 的 validateCertificatePair 硬限制(为 DoT/DDR 宣告检查 IP SAN)。所以:证书 SAN 里有 IP 才能用,改完配置务必确认 pidof AdGuardHome 还活着,否则立刻用备份回滚。DNS 服务端口(5553)完全不受影响。

第 5 步 · Firefox 单独导入根 CA
Firefox 不读 Windows 证书库,自带独立证书存储,所以要单独导一次。
操作路径:
- Firefox → 设置 → 隐私与安全 → 拉到底「证书」→ 查看证书
- 「证书颁发机构」标签 → 导入 → 选
pve-root-ca.cer - 勾选「信任使用此 CA 标识网站」→ 确定 → 重启 Firefox
备选:about:config → security.enterprise_roots.enabled = true(读 Windows 库)。若 Windows 库里根 CA 没导入成功,此法无效,仍需方法一手动导入。
手机同理:Android(设置 → 安全 → 加密与凭据 → 安装证书 → CA 证书)和 iOS(设置 → 通用 → VPN与设备管理 → 安装 + 再到「关于本机」→ 证书信任设置开启完全信任)都要各自导入一次。
第 6 步 · 爱快主路由上传自定义 SSL 证书
爱快支持自定义 Web 证书(官方功能),但它只有单槽位:新证书会顶掉旧的。解决办法是签一张”IP + 域名”双 SAN 的全家桶证书。
cd /root/253cert
printf "subjectAltName=DNS:997wan.com,DNS:*.997wan.com,IP:192.168.11.1nkeyUsage=digitalSignature,keyEnciphermentnextendedKeyUsage=serverAuthn" > san-ikuai-all.cnf
openssl req -new -newkey rsa:2048 -nodes -keyout ikuai-all.key -subj "/CN=192.168.11.1" -out ikuai-all.csr
openssl x509 -req -in ikuai-all.csr -CA /etc/pve/pve-root-ca.pem
-CAkey /etc/pve/priv/pve-root-ca.key -CAcreateserial
-days 3000 -sha256 -extfile san-ikuai-all.cnf -out ikuai-all.crt
openssl verify -CAfile /etc/pve/pve-root-ca.pem ikuai-all.crt
把 ikuai-all.crt 和 ikuai-all.key 下载到电脑,用记事本打开,按下面路径粘贴上传:
- 爱快 Web → 系统设置 → 登录管理 → 远程访问
- 【自定义SSL证书】点【管理】→ 勾选开启
- 证书(CRT)框:粘贴 ikuai-all.crt 全文(
-----BEGIN CERTIFICATE-----开头) - 私钥(KEY)框:粘贴 ikuai-all.key 全文(
-----BEGIN PRIVATE KEY-----开头) - 保存 → 返回「远程访问」页面再点一次「保存」

完成标志:浏览器访问 https://192.168.11.1 绿锁;外网用 https://你的域名:端口 访问时,导入过根 CA 的设备同样绿锁。
如实说明:内部 CA 的信任范围 = 导入过根 CA 的设备。公网 CA 签的域名证书在外网对所有人生效,而内部 CA 的证书只对你自己的设备生效——内网自用场景这是最优解,但别期待外网访客也绿。
验收 · 最终验收清单
| # | 检查项 | 命令 / 操作 | 期望结果 |
|---|---|---|---|
| 1 | PVE 证书 SAN | openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -text | grep -A1 Alternative |
含当前 IP |
| 2 | 证书链 | openssl verify -CAfile /etc/pve/pve-root-ca.pem /etc/pve/local/pve-ssl.pem |
OK |
| 3 | Windows 信任 | certmgr.msc → 受信任的根 → 找 Proxmox Virtual Environment | 条目存在 |
| 4 | PVE 面板 | Chrome 访问 https://192.168.11.100:8006 | 🔒 绿锁 |
| 5 | LuCI | https://192.168.11.253 | 🔒 绿锁 |
| 6 | AGH 面板 | http://192.168.11.253:3000 → 自动跳 https://192.168.11.253:3443 | 🔒 绿锁 |
| 7 | 爱快 | https://192.168.11.1 | 🔒 绿锁 |
| 8 | Firefox | 以上地址逐个访问 | 全部 🔒 |
| 9 | DNS 不受影响 | nslookup www.baidu.com 192.168.11.253 |
正常返回 IP |
FAQ · 常见问题
Q1:直接找 Let’s Encrypt 给 192.168.x.x 签一张不行吗?
不行。CA/Browser Forum 行业规范禁止受信 CA 为 RFC1918 私网地址签发证书,所有公网 CA 都拒绝。内网 IP 的绿锁只有自建 CA 一条路。
Q2:重签证书后 Firefox 还是红?
① Firefox 有独立证书库,必须按第 5 步单独导入;② 导入后要完全退出 Firefox 再开;③ 如果用 security.enterprise_roots.enabled 方案,前提是 Windows 库已导入成功。
Q3:root CA 和设备证书的有效期怎么配合?
根 CA 10 年(2036 年到期),设备叶证书签 3000 天(约 8 年)。只要根在受信任列表里,设备证书到期换新不需要重新导入任何东西——这也是”导入一次、全家绿锁”的前提。叶证书千万别签得比根 CA 还长寿。
Q4:PVE 重装了怎么办?
重装会生成一枚全新的根 CA(指纹不同),所有设备证书作废。需要在各浏览器删除旧根、重新导入新根,并重签各设备证书。
Q5:改过某台设备的 IP 怎么办?
证书 SAN 是死的。两件事:① 修 /etc/hosts(PVE);② 给该设备重签一张含新 IP 的证书换上。SAN 是”白名单”性质——多签几个 IP 无害,漏了必红。
Q6:证书会拖慢浏览速度吗?
不会。RSA-2048 握手开销毫秒级,内网延迟可忽略。
回滚 · 回滚手册
| 要撤销的 | 操作 |
|---|---|
| hosts 修改 | cp /root/hosts.bak.日期 /etc/hosts |
| PVE 自签证书 | cp /root/pve-ssl.pem.bak.日期 /etc/pve/local/pve-ssl.pem(key 同理)后 systemctl restart pveproxy |
| Windows 根 CA | certmgr.msc → 受信任的根证书颁发机构 → 证书 → 右键 Proxmox Virtual Environment → 删除 |
| OpenWrt uhttpd 证书 | 按 /root/uhttpd-cert-rollback.txt 里的旧值 uci set uhttpd.main.cert/key 后 commit + restart |
| AGH HTTPS | cp /etc/AdGuardHome.yaml.bak.tls-日期 /etc/AdGuardHome.yaml && /etc/init.d/AdGuardHome restart |
| 爱快自定义证书 | 同一入口取消勾选「自定义SSL证书」开关 → 保存,即回退默认证书 |
基于真实家用网络(PVE + OpenWrt + AdGuard Home + iKuai)实测整理 · 所有命令均已在生产环境验证 · 2026-10-01
- 文章名称:局域网 HTTPS 绿锁教程:用 PVE 内部 CA 给内网 IP 签证书(OpenWrt/AdGuard Home/爱快)
- 文章永久网址:https://www.997wan.com/lan-https-green-lock-pve-internal-ca/
- 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长 997笔记 进行删除处理。
- 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
- 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
- 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
- 如无特别声明本文即为原创文章仅代表个人观点,版权归《997笔记》所有,欢迎转载,转载请保留原文链接。