エラーメッセージ
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired
OpenSSL 1.1.1、3.0、3.5 を使う Python で表現は同じで、メッセージの後には「(_ssl.c:1082)」のようなソースの位置が続きます。有効期間がまだ始まっていない証明書では「certificate is not yet valid」になります。
Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_CERT_HAS_EXPIRED (10)
このエラーの意味
OpenSSL は、チェーン内に、有効期間がこのマシンの現在時刻より前に終了した証明書を見つけました。通常は、サーバーの証明書が更新されていないか、更新した証明書が配信されていないかのどちらかです。クライアントが古い CA バンドルにある期限切れのルートを通るパスを構築している場合や、クライアントの時計が間違っている場合もあります。
発生する理由
サーバーの証明書(または中間証明書)の有効期限が切れている
よくある更新が実行されなかったか、実行されたもののサービスが再読み込みされていません。クライアント側で何かを変更する前に、実際に配信されている証明書の日付を確認してください。
古い certifi またはシステムのバンドル
ときどき古い certifi のリリース(または古い OS イメージ)に固定された環境は、ルートの期限切れのバージョンしか知らず、期限切れのパスを構築することがあります。一方で、最新のクライアントは成功します。2021年に DST Root CA X3 のクロス署名が期限切れになったとき、多くの Python クライアントが動作しなくなったのはこのためです。
クライアントの時計が間違っている
ときどき時計が未来の時刻になっている VM やコンテナーのホストでは、有効な証明書が期限切れに見えます。すべてのサイトが一斉に失敗する場合は、まず時刻を確認してください。
修正方法
- 1.
配信されている証明書を確認する
証明書を読むためだけに検証を無効にして一度だけ取得し、notAfter を確認してください(デコーダーに貼り付けます)。その検証されていない接続を、ほかの目的に使ってはいけません。
python import socket, ssl # Read the served certificate without verifying it, to see its dates ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE with socket.create_connection(("api.example.com", 443)) as raw: with ctx.wrap_socket(raw, server_hostname="api.example.com") as tls: der = tls.getpeercert(binary_form=True) print(ssl.DER_cert_to_PEM_cert(der)) # paste into a certificate decoder - 2.
certifi または OS のバンドルを更新する
サーバー自身の証明書に問題がなければ、クライアントのルートを更新してください。certifi を使うライブラリでは pip install --upgrade certifi を、システムのバンドルでは ca-certificates パッケージを使います。
bash python3 -m pip install --upgrade certifi python3 -c "import certifi; print(certifi.__version__, certifi.where())" - 3.
システムの時計を修正する
クライアントで NTP を有効にしてください(コンテナーの場合はホストで有効にします)。
bash date -u sudo timedatectl set-ntp true
関連するエラー
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/x509certificate has expiredNode.js tls / https / fetchverify error:num=10:certificate has expiredOpenSSL CLI (openssl s_client / openssl verify)