上周接到客户电话,TP官网突然弹出浏览器"连接不是私密连接"的警告,页面完全打不开。SSL证书错误看着不起眼,处理不当却会让用户大量流失、给攻击者留口子。把这段时间排查同类问题的经验整理出来,遇到TP官方页面报SSL错误的同学可以直接对照操作。
SSL证书过期或中间CA配置错乱是最常见的触发因素。轮换证书时漏掉中间CA环节,整条信任链断裂,浏览器直接拒绝渲染页面。另一种容易忽略的情况是服务器NTP同步失败导致时间漂移,证书明明没到期,系统却判定它"已过期"。
排查思路不复杂。终端跑openssl s_client -connect 域名:443,看返回信息里notBefore和notAfter字段,再对照date命令输出。时间差超过5分钟先修NTP。证书本身没问题的话,检查Nginx配置里ssl_certificate路径是否指向了正确的文件。
证书确实过期了,去正规CA重新签发,把完整证书链(含中间证书)部署到服务器,重启web服务即可。我一般把fullchain.pem和privkey.pem放在独立目录,权限设为600,避免被其他进程误读。
证书没过期但浏览器仍报错,大概率是HSTS头被之前某次错误配置写进了缓存。在DevTools里把该域名的HSTS清掉,或者等24小时让浏览器自动丢弃。另外记得查有没有混合内容——页面里引用了HTTP协议的第三方资源,浏览器会直接拦截整个页面。
短期来看浏览器拦截了不安全连接,对用户算保护。但攻击者若利用证书异常窗口期做了流量劫持,那就不是保护而是暴露了。所以SSL错误出现后,第一时间去查服务器访问日志,确认异常时间窗口内有没有可疑的源IP和请求路径。
我的习惯是,SSL错误超过30分钟没修好,就切到备用域名把业务先跑起来,主域名挂一个静态维护页。别让用户对着一个红叉的浏览器界面干等,体验一旦崩了很难拉回来。
处理完之后把整个排查过程写进团队wiki,包括时间线、根因、修复步骤和回滚方案。下次再遇到SSL相关告警,值班同事能直接照着文档走,不用重新踩一遍坑。安全这件事,响应速度永远比事后复盘重要得多。