关键在于构建本地信任闭环:先建本地CA并签发服务器证书,再将ca.crt导入所有客户端信任库,最后在Nginx中正确配置ssl_certificate等指令指向对应文件。

要让内网自建服务器的 Nginx HTTPS 服务被客户端(尤其是浏览器)真正信任、不显示“不安全”警告,关键不是只配好 Nginx,而是构建一个完整的本地信任闭环:自己当 CA → 签发服务器证书 → 把根证书导入所有客户端的信任库。以下是清晰可行的三步主线:
生成本地可信 CA 并签发服务器证书
必须用「模拟 CA」方式,而非单条 req -x509 命令。这样才能让后续所有客户端通过一次导入 ca.crt 就永久信任你签发的所有内网服务。
-
创建根 CA(有效期建议 10 年):
openssl req -x509 -nodes -days 36500 -newkey rsa:2048 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyInternalCA" \ -keyout ca.key -out ca.crt
-
生成服务器私钥和 CSR(注意
CN必须是访问时用的地址,如intranet.local或192.168.1.100):openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyApp/CN=192.168.1.100"
-
用 CA 签发服务器证书(带 SAN 更稳妥,可额外加 IP 或域名):
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ -CAcreateserial -out server.crt -days 3650 -sha256
✅ 生成后你会得到:
ca.crt(根证书)、server.crt(站点证书)、server.key(无密码私钥)
把 ca.crt 导入客户端系统信任库
这是“受信任”的核心动作,每台访问机器只需做一次:
-
Windows:双击
ca.crt→ “安装证书” → 选择“本地计算机” → 存储位置选“受信任的根证书颁发机构” → 完成 -
macOS:双击
ca.crt→ 添加到“钥匙串访问”→ 右键证书 → “显示简介” → 展开“信任” → “始终信任” -
Linux(Chrome/Edge):将
ca.crt复制到/usr/local/share/ca-certificates/,运行sudo update-ca-certificates -
命令行工具(curl/wget):可通过
--cacert ca.crt显式指定,或配置环境变量
⚠️ 浏览器访问
https://192.168.1.100时不再弹“您的连接不是私密连接”,说明成功。
配置 Nginx 加载证书并启用 HTTPS
证书文件放好后,在 Nginx 的 server 块中启用 HTTPS,并确保路径正确、权限合理:
-
推荐存放路径(以 Linux 为例):
/etc/nginx/ssl/ca.crt # 权限 644 /etc/nginx/ssl/server.crt # 权限 644 /etc/nginx/ssl/server.key # 权限 600(仅 root 可读)
-
Nginx 配置片段(监听 443,支持 HTTP/2):
server { listen 443 ssl http2; server_name 192.168.1.100; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_trusted_certificate /etc/nginx/ssl/ca.crt; # 让客户端验证链 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers off; location / { root html; index index.html; } } -
别忘了加一个 80 端口跳转(可选但推荐):
server { listen 80; server_name 192.168.1.100; return 301 https://$host$request_uri; } -
最后检查并重载:
nginx -t && nginx -s reload
不复杂但容易忽略。











