绝大多数浏览器HTTPS警告源于证书链不完整,核心是Nginx未在TLS握手时发送完整证书链(域名证书+中间证书),需用openssl验证、正确拼接fullchain.pem并配置ssl_certificate指向该文件。

浏览器在 Nginx HTTPS 环境下提示证书警告,绝大多数情况不是“没配证书”,而是证书链、域名匹配或配置细节出了问题。核心解决思路是:先定位报错类型,再针对性修复,不盲目重装或重启。
一、快速识别警告属于哪一类
打开 Chrome,点击地址栏锁形图标 → “连接不安全” → “证书无效”,看具体错误描述:
- NET::ERR_CERT_DATE_INVALID:证书过期(Let’s Encrypt 免费证书 90 天有效期,常因未自动续期触发)
- NET::ERR_CERT_COMMON_NAME_INVALID:访问域名(如 www.example.com)和证书绑定域名(如 example.com)不一致;或通配符 *.example.com 无法覆盖三级域名 a.b.example.com
- NET::ERR_CERT_AUTHORITY_INVALID:最常见——证书链不完整(只配了站点证书,漏了中间证书),尤其在手机浏览器上必报错
- 您的连接不是私密连接(Chrome) / 此网站的安全证书存在问题(Safari):大概率是自签名证书未被系统信任,或服务器时间偏差超过±5分钟
二、证书链不完整:90% 的“红叉”根源
Nginx 必须把站点证书 + 所有中间证书按顺序拼成一个文件,否则客户端无法构建信任链。只放 cert.pem 是不够的。
- 确认你用的是哪家 CA:Let’s Encrypt 默认提供 fullchain.pem(含站点证书+中间证书),直接用它,别用单独的 cert.pem
- 手动合并示例(顺序不能错):
cat example.com.crt intermediate.crt > example.com.chained.pem - Nginx 配置中必须指向这个合并后的文件:
ssl_certificate /etc/nginx/ssl/example.com.chained.pem; - 验证是否生效:
openssl s_client -connect example.com:443 -showcerts 2>/dev/null | grep "subject\|issuer"
正常应输出至少 2 段证书信息(站点证书 + 中间证书)
三、证书与私钥是否真正匹配
上传或部署时容易搞混文件,导致握手失败。
- 检查私钥是否与证书对应:
openssl x509 -noout -modulus -in example.com.chained.pem | openssl md5
openssl rsa -noout -modulus -in example.com.key | openssl md5
两条命令输出的 MD5 值必须完全一致 - 确保私钥无密码保护(Nginx 启动时不支持交互式输入):
openssl rsa -in example.com.key -check → 应显示 “RSA key ok” - 权限要严格:
chmod 600 example.com.key(Nginx 主进程需可读)
四、其他高频踩坑点
- 混合内容(Mixed Content):HTTPS 页面里加载了 HTTP 资源(图片、JS、字体等),浏览器会主动屏蔽并标“不安全”。用 F12 → Console 查看具体被阻止的资源,全部改为 https:// 或 // 协议相对路径
- 443 端口未开放:云服务器安全组、本地防火墙(ufw/iptables/firewalld)必须放行 TCP 443,仅配置 Nginx 不够
- 时间不同步:服务器系统时间误差超过证书有效期范围(±5 分钟),会导致“已过期”误判。运行 timedatectl status 并启用 NTP 同步
- 自签名证书用于公网:仅限内网测试。若需局域网可信,推荐用 mkcert 工具生成并自动安装根证书到系统信任库


















