SSL 证书错误:原因与修复
简短回答:证书错误表示浏览器无法确认它真的在和你的网站通信。常见原因有:证书已过期(ERR_CERT_DATE_INVALID)、证书没有包含准确的域名(ERR_CERT_COMMON_NAME_INVALID)、缺少中间证书或使用自签名证书(ERR_CERT_AUTHORITY_INVALID),或者服务器只支持旧版 TLS。一条 openssl 命令就能看出是哪一种;修复几乎总是在服务器端,而自动续期可以避免大部分问题。
快速步骤
- 从外部读取证书. 用 openssl 检查证书的日期、域名和证书链。
- 把错误对应到原因. 已过期、域名不对、证书链不受信任,或协议问题。
- 在服务器上修复. 续期、包含所有主机名重新签发,或安装完整证书链。
- 允许 TLS 1.2 和 1.3. 关闭 TLS 1.0 和 1.1,并确保现代客户端可以连接。
- 自动续期. 证书现在最长只有 200 天有效期,很快将缩短到 100 天,因此续期必须自动化。
代码和配置保持英文。
第一步:从外部查看证书
浏览器会在警告下方显示错误代码(点击高级)。然后看看服务器实际发送了什么。下面的命令显示证书颁发给谁、由谁签发、有效期以及覆盖的所有主机名:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName下面的命令显示证书链以及是否验证通过(查找 Verify return code: 0 (ok)):
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
| grep -E '^ *[0-9]+ s:|Verify return code'NET::ERR_CERT_DATE_INVALID:已过期(或时钟错误)
证书的 notAfter 日期已过;如果只有某一位访客看到这个错误,则可能是他设备的时钟不对。续期证书并重新加载 Web 服务器。如果使用 Certbot,请确认自动续期确实在运行:
sudo certbot renew --dry-run
systemctl list-timers | grep -i certbot
sudo systemctl reload nginx # or: sudo systemctl reload apache2续期已不再是一年一次的事。根据 CA/Browser Forum 的规则,2026 年 3 月 15 日起签发的公共证书最长有效 200 天;2027 年 3 月 15 日起上限为 100 天;2029 年 3 月 15 日起为 47 天。手动续期将跟不上节奏,请使用主机商的自动证书或 Certbot 等 ACME 客户端。
NET::ERR_CERT_COMMON_NAME_INVALID:域名不匹配
证书本身有效,但不适用于地址栏中的域名。把地址与第一条命令输出的 subjectAltName 列表对比。典型原因:证书覆盖 yourdomain.com 但不包括 www.yourdomain.com;新增了子域名却没有证书;或服务器发送了同一 IP 上另一个网站(默认站点)的证书。用你使用的所有域名重新签发证书:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com --expand如果域名都正确,但仍收到其他网站的证书,请检查该域名的 server 块或虚拟主机是否有自己的证书配置行和正确的 server_name。
NET::ERR_CERT_AUTHORITY_INVALID:签发者不受信任或证书链断裂
要么证书是自签名的(测试可以,公开网站绝对不行),要么服务器只发送了你自己的证书,没有发送把它连接到受信任根证书的中间证书。有些桌面浏览器会自行补全缺口,所以网站在你那里正常,在手机或其他工具上却会失败。请始终配置完整证书链文件:
# nginx
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# Apache 2.4.8+
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSLProtocol -all +TLSv1.2 +TLSv1.3如果证书是从商业供应商购买的,请下载“full chain”或“bundle”版本,用它代替单独的证书文件。
ERR_SSL_PROTOCOL_ERROR 和 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
浏览器和服务器无法就协议达成一致。常见原因:服务器只提供当前浏览器已不再接受的 TLS 1.0 或 1.1;443 端口返回的是未加密的 HTTP;或证书与私钥不匹配。测试服务器接受哪些版本:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -tls1_2 </dev/null 2>/dev/null | grep -E 'Protocol|Cipher'
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -tls1_3 </dev/null 2>/dev/null | grep -E 'Protocol|Cipher'两条命令都应输出协议和加密套件。Mozilla 的 SSL Configuration Generator 为 nginx、Apache 等服务器提供经过测试的最新配置。
Cloudflare 526 错误与重定向循环
当网站前面有 Cloudflare 时,会有两张证书:Cloudflare 面向访客的证书,以及你的服务器用于与 Cloudflare 连接的证书。在 Full (strict) 模式下,526 错误表示服务器证书无效或已过期;请续期,或安装免费的 Cloudflare Origin Certificate。避免使用 Flexible 模式:到服务器的连接没有加密,再加上服务器端的 HTTPS 重定向,就会导致 ERR_TOO_MANY_REDIRECTS。
问题出在访客一侧时
- 设备日期或时间错误,会让所有网站都出现日期错误。
- 杀毒软件或企业的“HTTPS 检查”会替换证书,可能引发签发者错误。
- 公共 Wi-Fi 的登录页面会拦截第一个 HTTPS 请求,直到访客登录。
如果只有一个人看到错误,而上面的 openssl 检查都正常,很可能就是这些情况之一。
HackGrade 会检查什么
免费扫描会检查证书是否受信任,在证书三周内到期时发出警告,并标记旧版 TLS 和缺失的 HTTP 到 HTTPS 重定向。Site、Business 和 Agency 套餐每周重复扫描,并在发生变化时发送提醒。更多背景请参阅我的 SSL 证书配置正确吗?
常见问题
如何修复 NET::ERR_CERT_DATE_INVALID?
续期证书并重新加载 Web 服务器。如果再次发生,说明自动续期没有生效:运行“certbot renew --dry-run”或检查主机控制面板。如果只有一位访客看到,可能是他设备的时钟不对。
为什么网站在我的电脑上正常,在手机上却显示证书错误?
通常是缺少中间证书。有些桌面浏览器会自己获取,很多其他客户端不会。请配置完整证书链(fullchain.pem 或供应商提供的 bundle)。
我可以让访客点击“继续前往”吗?
不可以。警告之所以存在,是因为连接无法验证;让客户习惯忽略它会使他们面临风险。请修复证书。
现在 SSL 证书的有效期是多久?
2026 年 3 月 15 日起签发的公共证书最长有效 200 天。2027 年 3 月 15 日起上限降为 100 天,2029 年 3 月 15 日起降为 47 天,因此续期必须自动化。