Ruby openssl (Net::HTTP, Faraday, RubyGems)Ruby
错误信息
state=error: certificate verify failed (certificate has expired)
也可能输出为
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (certificate has expired)
完整消息:“SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (certificate has expired)”。尚未生效的证书会产生“(certificate is not yet valid)”。
Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect
含义
OpenSSL 在证书链中发现一张证书,其有效期在运行 Ruby 的机器的当前时间之前就已结束。最常见的情况是服务器证书没有续期,或者续期后的证书没有部署;在旧系统上,过时的 CA 证书包可能会让 OpenSSL 通过一张已过期的根证书构建路径。
原因
服务器证书已过期
常见续期失败,或者续期后没有重新加载服务。
旧系统上的 CA 证书包已过时
偶见长期使用、从未更新过 ca-certificates 软件包的镜像和服务器,可能只知道公共根证书的过期版本。
系统时钟不准确
偶见时钟超前会让有效的证书看起来已经过期。
修复方法
- 1.
检查服务器所提供证书的到期日期
如果日期已过,就续期;如果没有问题,就检查客户端的证书包和时钟。
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -enddate - 2.
更新客户端的 CA 证书包
更新 ca-certificates 可以修复通过已退役根证书构建路径的客户端。
bash # Old images: refresh the CA bundle Ruby's OpenSSL uses apt-get update && apt-get install --only-upgrade -y ca-certificates ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE' - 3.
续期并重新加载服务器
续期证书并重新加载负责 TLS 终止的服务;从网络一侧检查结果。
bash sudo certbot renew && sudo systemctl reload nginx
相关错误
curl: (60) SSL certificate problem: certificate has expiredcurl (OpenSSL backend)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509state=error: certificate verify failed (unable to get local issuer certificate)Ruby openssl (Net::HTTP, Faraday, HTTParty, RubyGems)