浏览器提示“不安全”主因是证书链不完整或客户端不信任,需三步闭环:1. 证书含san扩展;2. nginx的ssl_certificate为server.crt与中间证书拼接的完整链;3. 根证书导入客户端受信任库。

浏览器提示“不安全”,多数不是没配SSL,而是Nginx发出去的证书链或配置细节没到位。排查要从服务端输出、客户端验证、浏览器行为三层交叉印证,重点不在“有没有证书”,而在“浏览器能不能信它”。
看浏览器报的具体错误码
别只盯着“不安全”三个字,点地址栏锁图标 → “连接不安全” → “证书无效”,里面会显示真实错误码,这是最直接的线索:
- NET::ERR_CERT_AUTHORITY_INVALID:根证书不被信任(自签名/私有CA未导入,或中间证书缺失)
- NET::ERR_CERT_DATE_INVALID:证书过期,或服务器/客户端系统时间偏差超5分钟(2026年9月,检查证书是否覆盖当前日期)
- NET::ERR_CERT_COMMON_NAME_INVALID 或 NET::ERR_CERT_CN_NO_MATCH:访问域名不在证书的CN或SAN中(如用IP访问,但证书没写IP;或访问www.example.com,证书只写了example.com)
- NET::ERR_CERT_REVOKED:证书被吊销(少见,但自建CA误操作可能触发)
查Nginx是否真发出了完整证书链
自签名或非主流CA(如ZeroSSL、BuyPass)常因链不完整被拒。Nginx只靠ssl_certificate字段发送证书链,ssl_trusted_certificate完全不参与此过程。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 确认
ssl_certificate指向的文件是拼接体:先放域名证书(server.crt),紧接着追加中间证书(intermediate.crt),不要加根证书,两段间无空行 - 执行命令验证:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject=",输出应含至少两行——一行是你域名,一行是中间CA名(如Let's Encrypt R3) - 若只看到一行,说明链断裂,需重新拼接并重载Nginx:
nginx -t && nginx -s reload
验证书本身是否合规(尤其自签名场景)
现代浏览器(Chrome、Edge、Safari)强制要求证书含Subject Alternative Name(SAN),仅靠CN已失效。
- 用命令检查:
openssl x509 -in server.crt -text -noout | grep -A1 "Subject Alternative Name" - 输出必须类似:
X509v3 Subject Alternative Name: IP Address:192.168.1.100, DNS:dev.local - 若无该字段,需用-extfile指定扩展配置重新签发,不能仅改配置或重启Nginx
- 自签名时,访问的IP或域名必须严格匹配SAN中声明的条目
排除客户端和环境干扰
很多问题其实出在本地,而非服务器:
- 清空浏览器缓存,或换无痕窗口测试;iOS/Safari对证书链更敏感,务必用真机验证
- 检查客户端系统时间是否准确(2026年9月,偏差几分钟就会触发过期误判)
- 确认443端口已放行:云服务器安全组、iptables、ufw均需开放;用
telnet your-domain.com 443测试连通性 - 用MySSL输入域名检测:看“证书链”是否完整、“协议支持”是否含TLSv1.2+、“评级”是否A级以上










