资讯文章 资讯 · NEWS
HTTPS 上线之后还会出的三种岔子:证书过期、混合内容、中间证书
2026-10-23 约 1,916 字 预计阅读 5 分钟 yiyunkj
H
HTTPS 现在不是加分项,是入场券,这点没什么争议。装上证书只是第一步,后面那三种岔子,每一个都装了证书的站可能正在经历,只是自己不知道。

图片来源:网络,版权归原作者所有,侵权请联系删除
第一种:证书过期,而且是续期脚本悄悄失败
免费证书三个月一换,靠自动续期。自动续期失败的原因就那么几个,但都不容易察觉:
- 验证方式依赖 80 端口或某个固定路径,某次改了 Nginx 配置之后验证请求被拦了
- 用的是 DNS 验证,解析商的 API 密钥过期或者接口改了
- 续期成功了,但脚本只替换了证书文件没替换全链文件,效果上等于没换
- 服务器时间不对,证书被判定为尚未生效
最后一条听着离谱,实际发生过。新开的机器没配时间同步,差了几个小时,签出来的证书在验证方看来是未来签发的。
防的办法不复杂:加一个到期前告警,剩 30 天、剩 7 天各提醒一次;告警走邮件的话要确保那个邮箱有人看(就是把上一篇里的事做好)。另外可以把域名放进证书透明度过期提醒服务里,它会列出该域名下签发的所有证书,顺带能发现有没有人冒用你的域名签了证。
自查命令很简单,看返回的到期日期:openssl s_client -connect 域名:443 -servername 域名,输出里找有效期那两行。
第二种:混合内容,目录站的重灾区
页面是 https 的,但里面引用了 http 的图片、脚本、样式,这叫混合内容。浏览器会拦截其中一部分(脚本和 iframe 这类主动混合内容),图片这类被动的会以降级方式处理或者提示。
目录站特别容易中招,因为它天然引用大量外部资源:上千个条目的网站图标、截图、对方站点的 favicon。这些数据是几年前采集的,当时抓到的就是 http 地址,你全站上了 HTTPS 之后这些地址没跟着改,于是每个条目页上都有几十个 http 图片。
处理顺序:
先把本地资源改完。自己的 CSS、JS、图片用相对协议或者协议相对地址,这一步在模板里批量替换就行。
再把数据库里的外站图标地址批量处理。改不了 https 的(对方站点本身不支持),要么换成自己抓取后存在本地的副本,要么换成占位图标。注意别直接把 http 改成 https 了事,对方不支持的话就是一堆 404。
然后上 Content-Security-Policy: upgrade-insecure-requests,让浏览器自动把页面里的 http 请求升级成 https。这是个兜底手段,能救大部分历史数据。建议先用 Content-Security-Policy-Report-Only 跑一段时间,看报告里有多少请求会被影响,确认没有大面积资源失效之后再正式启用。
最后在浏览器控制台里翻一遍,控制台的 Mixed Content 警告是最直接的清单。
第三种:中间证书缺失,电脑正常手机报错
这是三种里最隐蔽的。证书链的结构是:站点证书由中间 CA 签发,中间 CA 再由根 CA 签发。根证书预装在客户端里,中间证书要服务器在握手时一起发过去。
如果服务器只发了站点证书,会发生什么?桌面端 Chrome、Edge 这类浏览器会通过证书里的 AIA 扩展去把中间证书下载下来,链补上了,看起来一切正常。安卓上的原生校验、Java 程序、curl、wget 这些客户端不做这个补全,链断在中间,直接报不受信任。
典型症状就是"我电脑上打开好好的,用户说手机上报证书错误",或者"对接方的服务器调我的接口报证书校验失败"。这种"部分人报错"的组合,基本可以直接判定为链不完整。
查法:openssl s_client -connect 域名:443 -servername 域名 -showcerts,看输出里有几段证书。只有一段就是缺了中间证书。也可以用在线的 SSL 检测服务,报告里会直接写链不完整。
修法是把证书按顺序拼成一个文件:站点证书在最前,中间证书在后,根证书不放(客户端本地有,发下去只是增加握手数据量)。Nginx 的 ssl_certificate 指向这个拼接后的全链文件,不是只含站点证书的那个。Apache 2.4.8 之后也是同样做法,不用再配单独的链文件指令。改完记得 nginx -t 再重载。
还有两个衍生坑:一是顺序写反,站点证书必须在最前,反了等于没修;二是续期脚本替换的时候只换了证书文件没换全链文件,于是"续期之后突然开始报错",这类反馈特别多。
三件事合成一张月检表
每个月花十分钟跑一遍:证书剩余天数、全站混合内容控制台警告、-showcerts 的输出段数。三个都在正常范围,HTTPS 这块就不会出事。
目录站因为条目多、外链资源多,这三件事的发生概率都比普通企业站高。值得做成脚本定期跑,而不是等用户来报。
HTTPS 装上之后不是结束。证书会过期、外站图标会拖后腿、证书链会缺一半,这三件事都发生在你不看的地方。