エラーメッセージ
invalid peer certificate: certificate expired: verification time
完全な形式:「invalid peer certificate: certificate expired: verification time <unix> (UNIX), but certificate is not valid after <unix> (<n> seconds ago)」。以前の rustls のリリースは、バリアント名だけを出力していました(「invalid peer certificate: Expired」)。まだ有効ではない証明書では、別の「not valid yet」バリアントになります。
rustls 0.23 (via reqwest, ureq, hyper-rustls) — CertificateError::ExpiredContext
このエラーの意味
rustls はチェーンを検証しましたが、その中の証明書が、検証時刻の時点で notAfter の日付を過ぎています。rustls 0.23 は、両方の時刻を Unix タイムスタンプで示し、証明書が何秒前に期限切れになったかも表示するため、問題が証明書にあるのか時計にあるのかがすぐにわかります。
発生する理由
サーバーの証明書の有効期限が切れた
よくある更新に失敗したか、更新した証明書がまだ返されていません。
クライアントの時計がずれている
ときどき組み込みデバイスや、NTP のないホスト上のコンテナーでは、時計が大きくずれていることがあります。メッセージ内の検証時刻を実際の時刻と比較してください。
トラストアンカーとして固定された期限切れの証明書
まれサーバー証明書そのものをルートとして追加したクライアントは、サーバーが証明書を更新した後も、その古い証明書に対して検証を続けます。
修正方法
- 1.
タイムスタンプを変換する
date -u -d @<seconds> で、両方の値を読みやすい UTC の時刻に変換できます。
bash # The message gives both instants as Unix seconds date -u -d @1743465600 # certificate's notAfter date -u # this machine's time - 2.
更新して再デプロイする
サーバーの証明書を更新してサービスを再読み込みし、ネットワーク側から新しい有効期限を確認してください。
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -enddate sudo certbot renew && sudo systemctl reload nginx