必须用 openssl 生成含 san 的自签名证书并正确配置 nginx,否则浏览器因缺失 subjectaltname 报 net::err_cert_common_name_invalid;需执行 openssl req -addext 指定 dns 和 ip,配置 ssl_certificate、ssl_certificate_key 路径及 tlsv1.2+ 协议,最后重载并验证监听。

直接用 OpenSSL 生成带 SAN 的自签名证书,再配进 Nginx,就能在内网快速启用 HTTPS。关键不是“能不能用”,而是“浏览器认不认”——没加 SAN 就会报 NET::ERR_CERT_COMMON_NAME_INVALID,哪怕只访问 https://localhost 也会拦。
生成含 SAN 的证书和私钥
现代浏览器强制校验 Subject Alternative Name(SAN),仅靠 CN=localhost 不够。必须显式声明所有可能访问的地址,比如 DNS 名和 IP。
- 创建目录:
sudo mkdir -p /etc/nginx/ssl - 执行命令(OpenSSL 3.0+):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout /etc/nginx/ssl/nginx.key \-out /etc/nginx/ssl/nginx.crt \-subj "/CN=localhost" \-addext "subjectAltName = DNS:localhost,IP:127.0.0.1,IP:192.168.1.100"
(把192.168.1.100换成你服务器实际的内网 IP) - OpenSSL 1.1.1 或更旧版本不支持
-addext,需用配置文件方式生成,可提供模板备用 - 设好权限:
sudo chmod 600 /etc/nginx/ssl/nginx.key、sudo chmod 644 /etc/nginx/ssl/nginx.crt
Nginx 配置 HTTPS server 块
只需一个标准 server 块监听 443 端口,重点是路径、协议和加密套件三处不能错。
- 证书路径必须准确:
ssl_certificate /etc/nginx/ssl/nginx.crt;ssl_certificate_key /etc/nginx/ssl/nginx.key; - 禁用老旧协议:
ssl_protocols TLSv1.2 TLSv1.3; - 加密套件建议用简洁安全组合:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; - 可选自动跳转:
server { listen 80; return 301 https://$host$request_uri; }
客户端访问与信任处理
自签名证书天然不被信任,但内网测试中无需全局部署根证书,按需处理即可。
- Chrome / Edge:访问时点「高级」→「继续前往(不安全)」,仅限临时调试
- curl 测试加
-k:curl -k https://localhost - macOS:双击
.crt文件 → 导入钥匙串 → 右键证书 → 「显示简介」→ 「信任」→ 设为「始终信任」 - Android:下载
nginx.crt→ 设置 → 安全 → 加密与凭据 → 安装证书 → 选择「CA 证书」
验证与常见排错
配置写完不等于跑通,四步检查缺一不可。
- 语法检查:
sudo nginx -t—— 必须显示successful - 重载服务:
sudo systemctl reload nginx或sudo nginx -s reload - 确认监听:
sudo ss -tnlp | grep :443应看到 nginx 进程 - 查错误日志:
sudo tail -f /var/log/nginx/error.log,重点关注证书路径不存在、权限拒绝、协议不匹配等提示











