SSL证书故障造成网站无法访问是很常见的情况。前一天网站访问正常,第二天打开浏览器弹出红色警告,提示连接不安全,附带NET::ERR_CERT开头错误码。很多人看到这段提示会慌乱,不知道从哪里排查。本质就是浏览器和服务器握手校验证书信息不匹配,拒绝建立加密连接。下面列举高频故障,讲清楚排查步骤和处理办法。
先查看浏览器展示的错误码,这是最直接的线索。不同错误码对应不同故障,确定错误码,排查方向会清晰很多。
NET::ERR_CERT_DATE_INVALID,代表证书过期或者还未到生效时间。不要直接续费证书,第一步先核对服务器系统时间。Linux执行timedatectl status,查看系统时间和真实时间偏差。服务器时间漂移数月,哪怕证书处于有效期,浏览器依旧判定过期。同步系统时间,运行sudo ntpdate -s time.nist.gov或者使用chrony校准时间,问题可能直接解决。服务器时间正常,就是证书过期。登录证书管理后台查看到期时间,过期证书无法修复,只能重新申请并且替换服务器证书。

NET::ERR_CERT_AUTHORITY_INVALID,代表浏览器不信任当前证书。最普遍原因是证书链不完整,服务器只部署域名证书,没有上传中间证书。浏览器校验证书,需要沿着信任链向上追溯,找到中间证书,最终匹配浏览器内置根证书,整条链路才算可信。只上传域名证书,缺少中间证书,链路断裂,浏览器判定证书不受信任。解决办法是合并域名证书和中间证书为一个文件,Nginx配置ssl_certificate指向合并后的fullchain.pem,不要单独使用域名证书文件。合并命令:cat yourdomain.crt intermediate.crt > fullchain.pem。还有一种容易忽略的情况,使用自签名证书,浏览器默认不信任,仅适合测试环境,正式站点需要CA机构签发的正规证书。
NET::ERR_CERT_COMMON_NAME_INVALID,证书绑定域名和访问域名不一致。很多人购买单域名证书,证书仅包含example.com,访客访问www.example.com,SSL体系判定为两个独立域名,浏览器校验失败报错。还有一种场景,更换域名之后没有同步替换服务器证书,依旧挂载旧证书。两种解决思路,重新申请覆盖全部所需域名的证书,或者服务器配置301重定向,将www流量统一跳转至不带www主域名,无论访客输入哪类地址都可以正常访问。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH这个报错,问题不在证书本身,而是TLS协议版本或者加密套件。老旧服务器配置仅支持TLS 1.0,现代浏览器已经标记TLS1.0、1.1不安全,直接拒绝握手。Nginx配置修改ssl_protocols为TLSv1.2 TLSv1.3,重启服务重试基本可以解决。Apache服务器检查SSLProtocol配置,删除老旧协议版本。
除证书相关报错,还有其他问题会伪装成证书异常。443端口未放行是高频情况。服务器配置证书,Nginx重启完成,外部依旧无法访问。优先检查云服务商安全组,入方向策略是否开放443端口。阿里云、腾讯云安全组只放行80端口,HTTPS请求会被拦截。服务器本地防火墙也要检查,Ubuntu的ufw、CentOS的firewalld,确认443端口允许访问。
DNS解析未生效也会制造类似故障。刚迁移服务器或者修改A记录,本地DNS缓存没有刷新,域名解析指向旧IP,旧服务器没有配置证书,访问就会抛出证书报错。使用nslookup或者dig指定公共DNS查询,核对返回IP是否为新服务器地址。返回旧IP,等待TTL过期或者手动清理本地DNS缓存。
浏览器缓存是容易忽略的因素。服务器替换新证书,后台确认生效,本地电脑打开网站依旧报错。大概率是浏览器缓存了旧证书信息。Chrome访问chrome://net-internals/#dns,点击Clear host cache,或者直接开启无痕窗口测试。无痕窗口访问正常,普通窗口报错,就是缓存问题。
CDN和反向代理带来的证书问题需要单独说明。网站前端接入Cloudflare或者其他CDN,访客获取的是CDN节点证书,不是源站证书。源站证书更新完成,但CDN控制台依旧挂载旧证书,访客看到的还是旧证书。需要登录CDN后台上传新证书,确认CDN的SSL模式为Full或者Flexible。Flexible模式下CDN到源站流量不加密,容易出现证书匹配提示,优先选用Full模式。
推荐一套节省时间的排查顺序。查看浏览器开发者工具,获取具体错误码,区分故障类型是过期、域名不匹配还是不信任。使用SSL Labs在线检测工具扫描域名,工具会检测证书链完整性、协议版本、中间证书缺失问题,直接标记故障点,比人工排查效率更高。命令行辅助核验,openssl s_client -connect 你的域名:443 -servername 你的域名,可以抓取服务器返回证书链,搭配openssl x509 -noout -dates -subject查看有效期与绑定域名,信息和预期不一致就是配置故障。
绝大多数SSL证书异常,根源集中在证书链、域名匹配、端口放行、缓存这四点。逐项检查耗时不长。证书配置问题大多一次性修复,不随意改动就不会重复出现。养成证书到期提醒习惯,免费证书三个月续期,付费证书按年续期,提前一两周完成续签,不要等到证书过期站点无法访问才处理。