内网https不报错的关键是让客户端信任自建ca根证书。需生成ca私钥和根证书,签发服务器证书,nginx配置完整信任链(合并证书或指定ssl_trusted_certificate),并导入ca.crt到客户端系统信任库。

内网 HTTPS 要真正“不报错”,关键不是只配好 Nginx,而是让客户端(比如员工电脑)信任你自己的根证书——否则浏览器始终显示“连接不安全”。核心是构建一条完整的、可验证的信任链:自建 CA → 签发服务器证书 → 客户端导入 CA 根证书 → Nginx 正确加载证书与私钥。
一、生成私有 CA 并签发服务器证书
所有操作建议在统一目录下进行(如 D:\nginx\ssl\ 或 /etc/nginx/ssl/),避免路径混乱。
- 生成 CA 私钥(ca.key):绝不外传,离线保管
- 用该私钥签发自签名根证书(ca.crt),有效期建议 10 年(3650 天)
- 为 Nginx 生成服务器私钥(server.key,无密码,Nginx 启动才可用)
- 生成证书签名请求(server.csr),其中 CN 填域名(如 intranet.local)或 IP(需在 SAN 扩展中明确定义)
- 用 ca.key + ca.crt 签发最终的 server.crt;推荐加 -CAcreateserial 自动生成序列号文件 ca.srl
二、Nginx 配置必须包含完整信任链
仅放 server.crt 和 server.key 不够。客户端需要能向上追溯到你信任的 ca.crt,所以推荐两种等效方式:
-
方式 A(推荐):合并证书链为 server-fullchain.crt(内容 = server.crt 换行 + ca.crt),然后配置:
ssl_certificate /path/to/server-fullchain.crt;
ssl_certificate_key /path/to/server.key; -
方式 B:分开指定,并显式声明信任锚点:
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
ssl_trusted_certificate /path/to/ca.crt;
同时务必启用 TLSv1.2+ 和合理加密套件,例如:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
三、客户端必须导入 ca.crt 到系统信任库
这是整个方案“生效”的最后一步,漏掉就白配:
- Windows:双击 ca.crt → “安装证书” → 选择“本地计算机” → “受信任的根证书颁发机构” → 完成
- macOS:双击 ca.crt → 添加到“钥匙串访问”→ 右键证书 → “显示简介” → “信任”展开 → “当使用此证书时”选“始终信任”
-
Linux(Chrome/Edge):多数基于 NSS 的浏览器需导入到系统 CA 存储,例如 Ubuntu 可运行:
sudo cp ca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
导入后,访问 https://intranet.local 就不会出现红色警告,地址栏显示锁形图标且标记为“安全”。
四、验证与排错要点
别跳过校验步骤,很多问题在启动前就能发现:
- 执行 nginx -t 确保语法和证书路径正确(路径必须是 Nginx 进程能读取的绝对路径)
- 用 openssl x509 -in server.crt -text -noout 查看证书 Subject 和 X509v3 Subject Alternative Name 是否含目标访问地址
- 用浏览器访问时按 F12 → “安全”标签页 → 查看“证书”是否显示“由您已信任的证书颁发机构颁发”
- 若仍提示不安全,检查是否误将 server.key 设为带密码版本(Nginx 不支持启动时交互输密)











