Linux 下为局域网 IP(如 192.168.1.100)打造不受浏览器警告的自签名 SSL/TLS 证书

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.crtrootca.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.crtserver.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

    bash 复制代码
    sudo 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:
  1. 打开 设置 →\rightarrow 隐私与安全 →\rightarrow 证书 →\rightarrow → 点击 查看证书
  2. 切换到 证书颁发机构 (Authorities) 选项卡,点击 导入 并选择 rootca.crt
  3. 勾选 信任此 CA 标识的网站 并保存。
🌐 Chromium / Chrome:
  1. 打开 设置 →\rightarrow 隐私和安全 →\rightarrow 安全 →\rightarrow 管理证书
  2. 切换到 颁发机构 (Authorities) 选项卡,点击 导入 并选择 rootca.crt
  3. 勾选所有信任选项并保存。

五、 校验与交互时序图

完成上述配置后,当客户端再次请求 [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 实践宣告成功!

相关推荐
小王C语言1 小时前
虚拟机开机过程中关机,再次开机没有分配 IP
linux·网络·tcp/ip
薛定谔的悦2 小时前
光储系统 AEMS 模块的光伏控制模式设计
linux·能源·储能·bms
JackSparrow4142 小时前
前端安全之JS混淆+请求加密+请求签名以提升爬虫难度
前端·javascript·后端·爬虫·python·安全
码农客栈2 小时前
U-Boot详解(三)之启动流程详解
linux·uboot
say_fall2 小时前
【Linux系统编程】文件操作基础:C标准库、系统调用、fd是什么和fd与FILE*的关系
android·linux·c语言
鹿鸣天涯2 小时前
应急响应:MySQL日志分析
mysql·安全·adb·oracle
砚凝霜2 小时前
软考网络工程师|第 4 章 WLAN MAC 机制、Ad Hoc、无线安全、WPAN 蓝牙 ZigBee 完整备考笔记
网络·笔记·安全
邪修king3 小时前
Re:Linux系统篇(六):动静态库 & 链接机制【完整透彻版】
linux·运维·服务器
严谨的麻辣烫9 小时前
Linux sysctl 网络参数调优实战:高并发与长连接场景下的内核配置
linux·网络·php