本文へスキップ
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

関連するエラー

署名エラーデータベースをすべて見る