
你申请了SSL证书,按照教程配好了Nginx,打开浏览器,地址栏里却没有出现期待的小锁。或者锁是灰色的,点开写着“此页面包含其他不安全的资源”。又或者,手机用户告诉你网站打不开,提示“证书不受信任”。
HTTPS配好了不等于配对了。证书本身没问题,但配置里有两个坑最容易让人翻车:混合内容和证书链不完整。
今天把这两个问题的原理和修复方法讲清楚。
先看一个数据
证书链不完整是SSL部署中最容易被忽视的问题之一,但占比相当高。许多人在部署时只上传了服务器证书,却遗漏了中间证书,导致浏览器无法验证完整的信任路径。而混合内容问题也很常见——页面中的图片、脚本、样式表等资源通过HTTP而非HTTPS加载,直接影响证书状态显示。
问题一:证书链不完整
这是什么?
证书链分三层:根证书(浏览器内置信任)→ 中间证书(CA机构签发)→ 服务器证书(你的域名专用)。
根证书已经预装在浏览器里,你不需要管。CA机构给你的是服务器证书(cert.pem)和中间证书(chain.pem),两个都要装。只装服务器证书,浏览器找不到中间证书,无法追溯到根证书,就会报“证书不受信任”。
症状
解决方法
Nginx:确保配置的是fullchain.pem,不是cert.pem。
nginx
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 服务器证书+中间证书 ssl_certificate_key /etc/nginx/ssl/privkey.pem;
如果CA只给了单独的服务器证书和中间证书,用文本编辑器把两个文件合并成fullchain.pem——服务器证书在前,中间证书在后。
Apache:需要单独配置中间证书文件:
text
SSLCertificateFile /path/cert.crt SSLCertificateChainFile /path/chain.crt SSLCertificateKeyFile /path/private.key
bash
openssl s_client -connect yourdomain.com:443 -showcerts
输出里应该能看到完整的证书链。只有一张证书说明中间证书没装。
问题二:混合内容
这是什么?
你的网站是HTTPS,但页面里引用了HTTP的资源——图片、CSS、JS、字体等。浏览器会认为页面不安全,因为那些HTTP资源在传输过程中可能被篡改或窃听。混合内容分为两类:
被动混合内容(可升级):图片、音频、视频。风险较低,现代浏览器会自动将HTTP升级到HTTPS,但仍会发警告。
主动混合内容(被阻止):脚本、样式表、iframe、字体。风险高,浏览器会直接阻止加载,可能导致页面功能损坏。
症状
排查方法
打开浏览器开发者工具(F12),切换到Console或Network标签。凡是HTTP加载的资源会被标注为“Mixed Content”或“blocked”,找到它们,逐一修复。
解决方法
1. 把所有资源链接改成HTTPS
页面里硬编码的HTTP链接,改成HTTPS:
html
<!-- 之前 --> <script src="http://cdn.example.com/app.js"></script> <!-- 之后 --> <script src="https://cdn.example.com/app.js"></script>
2. 使用协议相对路径
html
<script src="//cdn.example.com/app.js"></script>
浏览器会自动根据当前页面的协议加载资源——HTTPS页面会用HTTPS加载。
3. WordPress用户:批量替换数据库中的URL
WordPress的页面内容(文章、图片链接)通常存储在数据库中,需要执行SQL替换:
sql
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://旧域名', 'https://新域名');
或使用WP CLI的search-replace命令。
4. 配置Content Security Policy(CSP)阻止HTTP资源
nginx
add_header Content-Security-Policy "upgrade-insecure-requests;";
这个指令会让浏览器把所有HTTP请求自动升级到HTTPS。
其他常见HTTPS问题速查
| 问题 | 症状 | 解决方法 |
|---|---|---|
| 证书过期 | 浏览器提示“证书已过期” | 续期证书 |
| 域名不匹配 | 访问www.example.com但证书只绑了example.com | 申请通配符或多域名证书 |
| TLS版本过低 | 浏览器提示“连接不安全” | 禁用TLS 1.0/1.1,启用TLS 1.2/1.3 |
| 443端口未放行 | HTTPS完全打不开 | 检查安全组和防火墙规则 |
真实案例
一台服务器配置了Let’s Encrypt证书,Firefox访问正常,Chrome却显示“证书不受信任”。查了半小时才发现,部署脚本把fullchain.pem和privkey.pem写反了——私钥放在了ssl_certificate位置,证书放在了ssl_certificate_key位置。Nginx没有报错,但Chrome直接拒绝信任。调换顺序后恢复正常。
最后一句
HTTPS配置完不是终点,验证才是。打开浏览器开发者工具,看一眼Console有没有红色警告。用SSL Labs测一下,看看证书链是否完整。混合内容和证书链不完整,这两个问题占HTTPS配置故障的大头,排查起来不难,但不知道就容易被卡住。
先从这两个开始检查,大部分问题都能解决。




