解决 "certificate expired" 及常见的 SSL/TLS 错误:完整指南
SSL (安全套接层) 及其继任者 TLS (传输层安全) 是保持互联网安全的协议。它们确保您的浏览器与网站之间发送的数据经过加密且私密。然而,当证书出现问题时,浏览器会显示恐怖的警告页面,这可能会吓跑 99% 的访问者。
在本指南中,我们将解释最常见的 SSL/TLS 错误、它们发生的原因,以及如何为用户和网站所有者解决这些问题。
1. 常见的 SSL/TLS 错误消息
根据您使用的浏览器 (Chrome, Firefox, Safari) 或开发环境 (Node.js, Python),您会看到不同的错误代码:
- Chrome:
ERR_CERT_DATE_INVALID(证书日期无效),ERR_CERT_AUTHORITY_INVALID(证书颁发机构无效),ERR_CERT_COMMON_NAME_INVALID,ERR_SSL_PROTOCOL_ERROR - Node.js:
CERT_HAS_EXPIRED(证书已过期),UNABLE_TO_VERIFY_LEAF_SIGNATURE,SELF_SIGNED_CERT_IN_CHAIN - Python (Requests):
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed - Firefox:
SEC_ERROR_EXPIRED_CERTIFICATE,MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
2. 核心原因与解决方案
2.1 "certificate expired" (证书已过期 / ERR_CERT_DATE_INVALID)
SSL 证书是为特定期限(通常为 90 天到 1 年)颁发的。一旦超过该日期,证书就不再有效。
原因: 网站所有者忘记续订证书,或者自动续订流程(如 Let's Encrypt)失败。
解决方案:
- 针对网站所有者: 立即续订您的证书。如果使用 Let's Encrypt,请检查您的
certbot日志或 ACME 客户端配置。 - 针对用户: 检查您电脑的系统日期和时间。如果您的时钟错误,浏览器会认为一个有效的证书已经过期。
2.2 "self-signed certificate" (自签名证书 / ERR_CERT_AUTHORITY_INVALID)
默认情况下,浏览器仅信任由已知“证书颁发机构”(CA)(如 DigiCert 或 Let's Encrypt)颁发的证书。自签名证书是您自己创建的证书。
原因:
- 在生产环境网站上使用了自签名证书。
- 使用了未添加到电脑“受信任根”存储中的私有/公司内部 CA。
解决方案:
- 针对生产环境: 从 Let's Encrypt 获取免费证书,或从商业 CA 购买。
- 针对开发环境: 在本地使用自签名证书是可以的,但您需要让您的工具信任它们或绕过验证(尽管后者不安全)。
2.3 "certificate chain incomplete" (证书链不完整 / UNABLE_TO_VERIFY_LEAF_SIGNATURE)
SSL 证书不仅仅是一个文件;它是通往根 CA 的信任链。如果您的服务器配置中缺少“中间”证书(中级 CA),浏览器就无法验证该信任链。
原因: 服务器仅提供了“叶子”(网站)证书,而没有提供“完整链”(网站 + 中间证书)。
解决方案:
确保您的 Web 服务器(Nginx, Apache)配置为使用 CA 提供的 fullchain.pem(或等效文件)。
2.4 "SSL handshake failed" (SSL 握手失败)
这是一个广泛的错误,发生在客户端和服务器之间的初始“握手”期间。
原因:
- 协议不匹配(例如,客户端仅支持 TLS 1.0,但服务器要求 TLS 1.3)。
- 密码套件不匹配(没有共同的加密方法)。
- 服务器端防火墙或代理拦截了连接。
解决方案: 检查服务器的 TLS 配置。我们建议使用 Mozilla SSL 配置生成器 来获取安全且兼容的设置。
3. 进阶故障排查
3.1 SNI (服务器名称指示) 问题
在单个 IP 地址上托管多个网站的现代服务器上,服务器需要知道该显示哪个证书。如果客户端不支持 SNI(现在很少见),服务器可能会显示错误的证书,导致 COMMON_NAME_INVALID 错误。
3.2 HSTS (HTTP 严格传输安全)
如果网站使用 HSTS,浏览器将拒绝允许用户在出现 SSL 错误时“点击继续”。这是一种防止“中间人”攻击的安全特性。 解决方案: 您必须修复 SSL 错误;HSTS 无法绕过。
4. 预防措施与最佳实践
- 自动续订: 始终使用带有自动续订的服务(如 Let's Encrypt 配合 Certbot,或 Cloudflare 的托管 SSL)。
- 监控: 使用相关服务监控您的 SSL 证书到期时间和健康状况。
- 使用完整链: 在服务器配置中始终提供完整的证书链。
- 禁用弱协议: 禁用 SSLv2, SSLv3, TLS 1.0 和 TLS 1.1。仅允许 TLS 1.2 和 1.3。
5. 常见问题 FAQ
Q: 在出现 SSL 警告时点击“继续访问”安全吗?
答: 仅当您是开发人员并在测试自己的本地网站时才安全。永远不要在公共网站上这样做,尤其是对于银行、电子邮件或社交媒体,因为这会使您面临数据被盗的风险。
Q: 为什么我的网站在电脑上可以访问,但在手机上显示 SSL 错误?
答: 这通常是证书链不完整的问题。桌面浏览器在“补全”缺失的中级证书方面能力较强,而移动浏览器则严格得多。
Q: Cloudflare 可以修复 SSL 错误吗?
答: Cloudflare 可以隐藏用户与 Cloudflare 之间的 SSL 错误,但您仍然需要在 Cloudflare 与您的服务器之间安装一个有效的(或至少是 Cloudflare Origin 证书)证书,以确保完全安全。
6. 快速检查工具
需要检查证书或验证证书链?使用我们的 SSL 证书检查与解码工具。它允许您:
- 解码 PEM 和 CRT 文件,查看过期日期和颁发者信息。
- 验证证书链并识别缺失的中间证书。
- 在 PEM, DER 和 PFX 等格式之间进行转换。
相关错误
- 解决 'Unexpected token in JSON' 错误
- 如何修复 'invalid base64 string' 错误
- 解决 'JWT expired' 错误