Linux 下为局域网 IP(如 192.168.1.100)打造不受浏览器警告的自签名 SSL/TLS 证书
在局域网开发、测试或搭建私有云服务(如 NAS、Docker 控制台、内部 GitLab 等)时,我们通常通过 IP 地址直接访问。如果使用普通的自签名证书,浏览器总是会弹出一道刺眼的警告页面------ "您的连接不是私密连接" (NET::ERR_CERT_AUTHORITY_INVALID) 。
要完美解决 IP 地址访问的 HTTPS 安全警告,核心原理是:自建一个本地根证书颁发机构(Root CA),将 IP 地址写入证书的 SAN(Subject Alternative Name,使用者可选名称)扩展,再将根证书导入客户端的信任库中。
本文将以局域网 IP 192.168.1.100 为例,带你一步步落地可执行的实践方案。
整体架构与签发流程
在开始操作前,我们可以通过下图清晰地理解本地 CA 体系架构与信任逻辑:
lua
+----------------------------+
| 本地根证书颁发机构 (Root CA) |
| rootca.key + rootca.crt |
+-------------+--------------+
|
[ 使用 CA 签发 ]
|
v
+----------------------------+
| 服务器证书 (Server) |
| server.key + server.crt |
| (包含 SAN: 192.168.1.100) |
+-------------+--------------+
|
v
+------------------------+------------------------+
| |
v v
+-------------------------------+ +-------------------------------+
| 服务端配置 (如 Nginx) | | 客户端信任 (系统 / 浏览器) |
| 部署 server.key / server.crt | | 导入并信任 rootca.crt |
+-------------------------------+ +-------------------------------+
一、 生成本地根 CA(Root CA)
根 CA 是整个信任链条的核心,只需生成一次,后续可以为局域网内的多个 IP 或域名重复签发证书。
1. 生成 CA 私钥
Bash
csharp
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out rootca.key
2. 生成自签名的 CA 根证书
Bash
vbnet
openssl req -x509 -key rootca.key -out rootca.crt -subj "/CN=lan-local-ca/O=my-lan-ca"
注意 :生成的
rootca.crt就是后续需要分发并导入到电脑/手机等客户端信任库中的根证书文件。
二、 为 IP 地址(192.168.1.100)签发服务端证书
现代浏览器(如 Chrome、Edge、Firefox)强制要求证书必须配置 SAN(Subject Alternative Name) ,单纯将 IP 写入 CN(Common Name)已被废弃。
1. 生成服务端私钥
Bash
csharp
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out server.key
2. 编写 OpenSSL 配置文件 (csr.conf)
新建名为 csr.conf 的文本文件,将局域网 IP 明确写在 [alt_names] 的 IP.x 字段下:
Ini, TOML
ini
[req]
distinguished_name = dn
prompt = no
req_extensions = req_ext
[dn]
CN="192.168.1.100"
[req_ext]
subjectAltName = @alt_names
[alt_names]
# 指定访问的局域网 IP 地址:
IP.0 = 192.168.1.100
# 如果有多个局域网 IP 或备用域名,可以继续追加:
# IP.1 = 127.0.0.1
# DNS.0 = myapp.local
3. 生成证书签名请求(CSR)
结合配置文件与服务端私钥生成 CSR 文件:
Bash
vbnet
openssl req -new -key server.key -out server.csr -config csr.conf
4. 使用本地 CA 签发 IP 证书
使用第一步创建的 rootca.crt 和 rootca.key 签发最终的服务器证书(设置有效期为 365 天):
Bash
objectivec
openssl x509 -req -days 365 -extensions req_ext -extfile csr.conf -CA rootca.crt -CAkey rootca.key -in server.csr -out server.crt
此时,你得到了部署 HTTPS 服务所需的两个核心文件:
- 证书公钥 :
server.crt - 证书私钥 :
server.key
三、 在 Web 服务器中部署(以 Nginx 为例)
将生成的 server.crt 和 server.key 复制到服务器(例如 /etc/nginx/ssl/ 目录),并在 Nginx 配置文件中加入:
Nginx
ini
server {
listen 443 ssl;
server_name 192.168.1.100;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080; # 替换为你实际的服务端口
}
}
重载 Nginx 服务:sudo systemctl reload nginx。
四、 将根证书(rootca.crt)导入客户端信任库
这是消除浏览器"不安全"警告的关键一步。只需将 rootca.crt 导入访问客户端,server.key 绝对不能公开。
1. Linux 系统级信任
-
Ubuntu / Debian:
Bash
bashsudo cp rootca.crt /usr/local/share/ca-certificates/lan-rootca.crt sudo update-ca-certificates -
Arch Linux:
Bash
sudo trust anchor rootca.crt
2. 浏览器独立导入(针对 Linux 下的 Chrome / Firefox)
如果操作系统更新证书库后浏览器仍弹窗警告,可在浏览器中单独导入:
css
[浏览器设置] ──> [隐私和安全] ──> [安全/证书] ──> [管理证书] ──> [证书颁发机构/Authorities] ──> [导入 rootca.crt] ──> [勾选"信任此证书"]
🦊 Firefox:
- 打开 设置 → 隐私与安全 → 证书 → 点击 查看证书。
- 切换到 证书颁发机构 (Authorities) 选项卡,点击 导入 并选择
rootca.crt。 - 勾选 信任此 CA 标识的网站 并保存。
🌐 Chromium / Chrome:
- 打开 设置 → 隐私和安全 → 安全 → 管理证书。
- 切换到 颁发机构 (Authorities) 选项卡,点击 导入 并选择
rootca.crt。 - 勾选所有信任选项并保存。
五、 校验与交互时序图
完成上述配置后,当客户端再次请求 [https://192.168.1.100](https://192.168.1.100) 时,内部的信任校验过程如下:
scss
客户端 (浏览器) 服务端 (192.168.1.100)
| |
| ------------ 1. 发起 HTTPS 请求 ------------> |
| |
| <----------- 2. 返回 server.crt ------------ |
| |
[ 检查 SAN ] |
• 包含 192.168.1.100? (是) |
[ 验签 信任链 ] |
• 由信任库中的 rootca.crt 签发? (是) |
| |
| ===== 3. 建立安全连接(显示绿色安全锁) ===== |
访问 [https://192.168.1.100](https://192.168.1.100),此时地址栏中的警告消失,取而代之的是安全的锁定图标,整个局域网 HTTPS 实践宣告成功!