浏览器提示“不安全”主因是证书链不完整、Nginx配置未生效或页面混用HTTP资源:需将域名证书与中间证书拼接为fullchain.pem并正确配置ssl_certificate;执行nginx -t && nginx -s reload确认生效;检查网页是否引用http资源,同时确保域名匹配、证书未过期、系统时间准确及443端口放行。

浏览器显示“不安全”不是证书没放上去,而是信任链断了、配置没生效,或页面本身在偷偷加载 HTTP 资源。核心就三点:证书链是否完整发给了浏览器、Nginx 是否真加载了新配置、网页里有没有混用不安全链接。
证书链是否真正传给了浏览器
只把域名证书(example.com.crt)放进 ssl_certificate 是不够的。浏览器需要中间证书才能连到它信任的根 CA。如果缺失,握手时只返回一个证书,信任链就断了。
- 用命令实测:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject=",正常应看到两行以上,一行是你的域名,另一行是中间 CA(如 Let's Encrypt R3 或 DigiCert SHA2 Secure Server CA) - 正确做法:把域名证书和中间证书拼成一个文件,顺序必须是——域名证书在前,中间证书紧随其后,中间不能有空行,不能包含根证书
- 生成命令示例:
cat example.com.crt intermediate.crt > /etc/nginx/ssl/fullchain.pem,然后 Nginx 配置中明确指向这个文件:ssl_certificate /etc/nginx/ssl/fullchain.pem;
Nginx 配置是否真的生效
改了配置文件不等于 Nginx 就用了它。常见情况是写了路径、忘了重载,或语法错误导致 reload 失败,甚至被其他 server 块覆盖。
- 先检查语法:
nginx -t,必须输出 success 才能继续 - 再重载:
nginx -s reload,不要跳过这步 - 排查多 server 块干扰:用
grep -r "server_name\|ssl_certificate" /etc/nginx/conf.d/扫描所有配置,确认你要访问的域名(比如 www.example.com 和 example.com)是否被唯一、精确匹配;临时注释掉其他块,只留一个测试
网页是否存在混合内容(Mixed Content)
证书再完整,只要页面里引用了一个 http:// 的图片、JS、CSS 或 iframe,浏览器就会降级为“不安全”,地址栏锁图标变黄或带感叹号。
- 打开 Chrome,按 F12 → 切换到 Console 或 Security 标签页,直接看到被阻止的 HTTP 资源列表
- 把报错链接复制出来,在地址栏手动改成 https 访问——能打开就说明服务端支持,直接代码里把
http://换成https://或用相对路径(如src="/js/app.js") - 外链无法升级 HTTPS 的,下载到本地服务器,改用站内路径调用
别漏掉这几个硬性前提
这些看似简单,但一出错就直接触发警告,且和证书本身无关:
-
域名必须完全匹配:访问
https://www.example.com,证书就得包含 www.example.com;单域名证书不能用于子域名,得用 SAN 证书或多域名证书 -
证书不能过期:当前时间是 2026 年 8 月,检查证书有效期是否覆盖这个时间点,用
openssl x509 -in cert.pem -dates -noout查看 - 系统时间要准:服务器或你本地电脑时间偏差超过 ±5 分钟,浏览器会误判证书“未生效”或“已过期”,务必开启自动网络校时
- 443 端口必须放行:云服务器安全组、本地防火墙、路由器都要确认开放了 TCP 443 端口,否则根本连不上 HTTPS


















