必须用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文件 → 导入钥匙串 → 右键证书 → 「显示简介」→ 「信任」→ 设为「始终信任」
验证配置是否生效
别跳过这步,很多问题出在 reload 前没检查语法或监听未生效。
- 检查配置语法:
nginx -t - 重载配置:
sudo nginx -s reload - 确认监听状态:
sudo ss -tlnp | grep :443或sudo netstat -tlnp | grep :443 - 用浏览器或 curl 访问
https://localhost,看是否能加载且无连接中断











