HTTPS 证书报错排查手册:6 个高频错误码及解决方法
做开发和运维这几年各种 SSL/TLS 证书报错我基本都踩过一遍。浏览器弹出来的那些红色警告页面刚开始看着挺唬人但搞明白原理之后其实都有对应的排查路径。这篇把我遇到过的几个最常见的错误码整理出来每个都写了出现场景、排查思路和修复方法当个速查手册用。目录ERR_CERT_DATE_INVALID — 证书过期NET::ERR_CERT_AUTHORITY_INVALID — CA 不受信任ERR_CERT_COMMON_NAME_INVALID — 域名不匹配ERR_SSL_VERSION_OR_CIPHER_MISMATCH — 协议或加密套件不兼容ERR_CERT_REVOKED — 证书被吊销Mixed Content 警告 — 混合内容1. ERR_CERT_DATE_INVALID — 证书过期什么时候会出现证书有一个固定的有效期免费证书通常 90 天付费证书 1 年过期之后浏览器就会拦截弹出这个错误。另外一种不太常见的情况是客户端系统时间不对比如服务器或者本地电脑时钟偏差太大。怎么排查用 openssl 看一下证书的有效期openssl s_client-connectexample.com:443-servernameexample.com2/dev/null|openssl x509-noout-dates输出里notAfter就是过期时间。如果已经过了那就是证书确实到期了。如果证书没过期检查一下本地系统时间date怎么修证书过期重新申请或续签证书替换服务器上的证书文件reload nginx/apache系统时间不对同步 NTP 时间ntpdate pool.ntp.org或者配好 chronyd这个错误是所有证书问题里最高频的特别是用免费证书的时候90 天一到就容易忘。建议搞个到期监控提前几天提醒自己。2. NET::ERR_CERT_AUTHORITY_INVALID — CA 不受信任什么时候会出现用了自签名证书证书链不完整缺少中间证书证书是由一个不在浏览器信任列表里的 CA 签发的开发环境用自签名证书很常见但放到生产环境就会被浏览器拦。怎么排查openssl s_client-connectexample.com:443-servernameexample.com看输出里的verify return codeverify return code: 18 (self signed certificate)— 自签名verify return code: 21 (unable to verify the first certificate)— 缺中间证书也可以用 SSL Labs 在线检测它会把证书链问题标得很清楚。怎么修自签名证书换成正规 CA 签发的证书。免费的 Let’s Encrypt 就够用缺中间证书把中间证书和服务器证书合并成一个 fullchain 文件。nginx 配置里ssl_certificate指向这个合并后的文件CA 不受信任确认 CA 在主流浏览器的信任列表里或者换一个受信任的 CAssl_certificate /etc/ssl/fullchain.pem; # 包含中间证书 ssl_certificate_key /etc/ssl/privkey.pem;3. ERR_CERT_COMMON_NAME_INVALID — 域名不匹配什么时候会出现证书里写的域名和你实际访问的域名对不上。最典型的场景证书签给了example.com但你访问的是www.example.com证书签给了a.example.com但你访问的是b.example.com用 IP 访问但证书签给的是域名怎么排查openssl s_client-connectexample.com:443-servernameexample.com2/dev/null|openssl x509-noout-text|grep-A1Subject Alternative Name看输出里的 SANSubject Alternative Name字段里面列出了证书覆盖的所有域名。怎么修如果只是少了www前缀重新申请时把example.com和www.example.com都加上如果有多个子域名考虑用通配符证书*.example.com一张证书覆盖所有子域名如果是 CDN/反代场景确认回源和边缘节点上配的证书都对通配符证书在多子域名场景下特别好用不用每加一个子域名就重新申请。4. ERR_SSL_VERSION_OR_CIPHER_MISMATCH — 协议或加密套件不兼容什么时候会出现客户端和服务端在 TLS 握手阶段谈不拢找不到双方都支持的协议版本或加密套件。常见于服务端还在用 TLS 1.0/1.1但新版浏览器已经不支持了服务端配置的加密套件太旧或太新和客户端没有交集某些老旧设备/系统访问只支持新协议的服务器怎么排查# 检查服务端支持的协议版本openssl s_client-connectexample.com:443-tls1_2openssl s_client-connectexample.com:443-tls1_3# 查看支持的加密套件nmap--scriptssl-enum-ciphers-p443example.com怎么修nginx 推荐配置兼顾安全和兼容性ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on;TLS 1.0 和 1.1 已经被主流浏览器废弃不建议再开。如果必须兼容老客户端可以单独开一个端口走老协议但要评估安全风险。5. ERR_CERT_REVOKED — 证书被吊销什么时候会出现证书被 CA 主动吊销了。可能的原因私钥泄露你主动向 CA 申请吊销CA 发现签发过程有问题批量吊销了一批证书域名所有权变更浏览器通过 OCSP 或 CRL 查询到这张证书已经在吊销列表里就会拦截。怎么排查# 检查 OCSP 状态openssl s_client-connectexample.com:443-servernameexample.com-status2/dev/null|grep-A3OCSP Response Status如果显示revoked说明确实被吊销了。怎么修被吊销的证书没法恢复只能重新申请一张。流程生成新的私钥和 CSR向 CA 提交签发请求替换服务器上的证书和私钥reload web 服务另外建议开启 OCSP Stapling让服务端主动推送 OCSP 响应减少客户端查询延迟ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8;6. Mixed Content 警告 — 混合内容什么时候会出现页面本身是 HTTPS 加载的但里面引用了 HTTP 的资源图片、JS、CSS、iframe 等。浏览器会对 JS/CSS/iframe 等主动混合内容直接拦截页面功能可能挂掉对图片/视频等被动混合内容只是在控制台里报个警告但地址栏的锁会消失怎么排查打开浏览器开发者工具F12切到 Console 标签页搜Mixed Content关键字能看到具体是哪个资源还在走 HTTP。怎么修把资源链接从http://改成https://或者用协议相对路径//如果是第三方资源不支持 HTTPS考虑下载到本地用自己的 HTTPS 域名提供在 nginx 里加一个全局重定向把所有 HTTP 请求 301 到 HTTPSserver { listen 80; server_name example.com; return 301 https://$host$request_uri; } - 可以用 CSP 头强制浏览器升级所有请求Content-Security-Policy: upgrade-insecure-requests;--- ## 小结 这几个错误码覆盖了日常碰到的绝大多数 HTTPS 证书问题。归纳一下核心思路 | 错误码 | 核心原因 | 快速定位 | |--------|---------|---------| | ERR_CERT_DATE_INVALID | 证书过期或系统时间不对 | openssl x509 -noout -dates | | ERR_CERT_AUTHORITY_INVALID | 自签名/缺中间证书 | openssl s_client 看 verify code | | ERR_CERT_COMMON_NAME_INVALID | 域名不匹配 | 查 SAN 字段 | | ERR_SSL_VERSION_OR_CIPHER_MISMATCH | 协议/套件不兼容 | nmap ssl-enum-ciphers | | ERR_CERT_REVOKED | 证书被吊销 | OCSP 查询 | | Mixed Content | HTTPS 页面引用 HTTP 资源 | 浏览器控制台 | 证书过期是最常见的特别是免费证书 90 天一轮。如果子域名多、部署环境多手动管理证书很容易遗漏。我自己现在用 ssl.spug.cc 来管通配符证书和到期监控省了不少事。