跳到主要内容
ecdsa.com
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 通过一张已过期的根证书构建路径。

原因

修复方法

  1. 1.

    检查服务器所提供证书的到期日期

    如果日期已过,就续期;如果没有问题,就检查客户端的证书包和时钟。

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -subject -enddate
  2. 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. 3.

    续期并重新加载服务器

    续期证书并重新加载负责 TLS 终止的服务;从网络一侧检查结果。

    bash
    sudo certbot renew && sudo systemctl reload nginx

相关错误

浏览完整的签名错误库