自签名证书无证书链,因其issuer与subject一致,属单级信任锚;报错net::err_cert_authority_invalid主因是客户端未信任该根证书,而非服务端配置链,需确保含san、正确配置nginx证书路径,并在客户端导入并设为始终信任。

自签名证书本身没有“证书链”,因为它不是由上级CA签发的,而是自己给自己签名。所以严格来说,测试环境用自签名证书时,不需要、也不能配置传统意义上的证书链。浏览器报错“NET::ERR_CERT_AUTHORITY_INVALID”或“无法建立信任链”,根本原因不是Nginx没配链,而是它压根没被客户端信任。
为什么自签名证书没有证书链
证书链是“终端证书 → 中间CA → 根CA”的信任传递路径。而自签名证书的 Issuer 和 Subject 完全一致,它既是叶子证书,也是根证书,中间环节为零。OpenSSL 生成时用 -x509 参数就代表直接签出一个自签名证书,不经过 CSR + 签发流程,自然不产生链文件。
实际配置中要避免的误区
-
不要复制粘贴公网证书链的写法:比如误加
ssl_trusted_certificate或把自签证书重复拼成“crt + crt”当链用,Nginx 不会报错但毫无作用; - 不要试图用 openssl ca 命令生成中间证书再签——那已不属于“自签名”,而是搭建私有CA了;
- 别把私钥当证书链塞进 ssl_certificate 指令里,会导致 Nginx 启动失败或 TLS 握手中断。
真正该做的三件事
让自签名证书在测试环境“可用”,重点不在服务端链配置,而在补齐信任前提:
-
确保证书含 SAN(Subject Alternative Name):现代浏览器强制校验,仅设
CN=localhost不够。必须包含所有访问方式,例如:subjectAltName = DNS:localhost, IP:127.0.0.1, IP:192.168.5.20; -
Nginx 配置只写两个必需指令:
ssl_certificate /path/to/nginx.crt;ssl_certificate_key /path/to/nginx.key;
路径必须准确,权限设为644(证书)和600(私钥); -
客户端侧手动信任(一次导入,长期有效):
• macOS:双击.crt→ 导入钥匙串 → 右键证书 → “显示简介” → “信任” → “始终信任”;
• Windows:右键安装 → 选择“本地计算机” → 存入“受信任的根证书颁发机构”;
• Linux(Chrome/Edge):需通过certutil或系统证书管理器导入到 NSS 数据库。
如果真想模拟带链环境(进阶需求)
那就不该用纯自签名,而应走内网私有CA路线:
- 先用 OpenSSL 自建一个根CA(
ca.crt+ca.key); - 再用该 CA 签发服务器证书(生成
server.crt,并确保其 issuer 是你的 CA); - Nginx 配置中,
ssl_certificate放server.crt,ssl_certificate_key放对应私钥,同时把ca.crt追加到server.crt文件末尾(即:server.crt 内容 = server.crt + \n + ca.crt),这就构成了可识别的链; - 最后只需将
ca.crt分发并导入所有客户端的根证书存储区,所有由它签发的服务器证书就自动可信。











