一、问题描述
在服务协议由 http 迁移至 https 时,我发现线上环境报错
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
Caused by: java.security.cert.CertificateExpiredException: NotAfter: Sat May 30 18:48:38 CST 2020
二、问题排查
根据报错 CertificateExpiredException: NotAfter: Sat May 30 18:48:38 CST 2020 是因为证书过期,我立即联系客户技术部确认他们的证书是否过期,经查证没有过期
但是在生产和测试环境都报证书过期错误,奇怪的是本地环境可以正常访问
于是我在 https://whatsmychaincert.com/ 验证其证书链是否有问题,果然经查证其证书链中有过期的证书:
所以原因定位在客户服务器的证书链中存在过期证书
三、什么是证书链
简单来说,当客户端访问 TLS 服务器时,服务端会发送一个证书给客户端来证明其身份,客户端需要构建一条由服务端证书到根证书的证书链,以便对其进行验证。服务端很贴心,帮客户端返回了一条证书链
如果服务端的证书链是这个样子: