エラーメッセージ
x509: certificate has expired or is not yet valid: current time 2026-08-20T15:47:41+03:00 is after 2026-08-19T12:47:41Z
2 つのタイムスタンプには、失敗ごとに実際の値が入ります。検証者の時計の時刻と、証明書の有効期間の境界です。「is after」は期限切れを、「is before」は有効期間の開始前であることを意味します。
Go crypto/x509 — CertificateInvalidError (Expired)
このエラーの意味
検証時刻が、証明書の有効期間 [NotBefore, NotAfter] から外れています。Go はメッセージの中で比較の両側を示すため、このエラーは診断結果を自ら含む数少ないエラーの 1 つです。2 つのタイムスタンプを読み、証明書の日時と時計のどちらが間違っているかを確認してください。
発生する理由
更新の自動化が機能しなくなった
よくある停止した certbot のタイマー、認可を失った ACME アカウント、別の場所で更新が成功した後も古い証明書を返し続けるロードバランサーなどが該当します。パブリック証明書の最大有効期間は 2029年までに 47 日へと短縮されていくため、手動での更新はもはや現実的ではありません。
検証するマシンの時計が間違っている
よくある起動直後のデバイス(RTC のない Raspberry Pi、スナップショットから復元した VM、IoT 機器)で「is before」の失敗が出る場合、通常は時計が 1970年や先月を示しています。そうなると、現在の証明書はすべて、有効期間の開始前か期限切れに見えます。
有効期間の境界での時刻のずれ
ときどき数秒前に発行された証明書(NotBefore = 現在時刻)を、時計が 1 分遅れているホストで検証すると、有効期間の開始前と判定されて検証に失敗します。サービスメッシュの有効期間の短い証明書では、この境界に引っかかりやすくなります。
修正方法
- 1.
実際に返されている証明書の日付を確認する
エンドポイントが今まさにどの証明書を返しているかを確認してください。更新後の「期限切れ」は、多くの場合「新しい証明書は存在するが、返されていない」ことを意味します。ディスク上の日付と通信上の日付が異なる場合は、TLS を終端しているプロキシをリロードまたは再起動してください。
bash echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 -noout -dates # notBefore=... notAfter=... - 2.
時刻同期を修正して監視する
「is before」のケースでは、時計を修正し、正しい状態を維持してください。証明書の検証は、ローカルの時刻が正確であってはじめて正しく機能します。
bash timedatectl status # NTP active? sudo timedatectl set-ntp true - 3.
更新を自動化し、残りの有効期間をアラートで監視する
有効期間の 2/3 が経過した時点で更新し(certbot のデフォルト)、有効期限はホストの外部から監視してください。ecdsa.com のドメイン署名診断(Signature Health)は、まさにこの点(チェーン、日付、有効期間の短縮に関する新しいルール)を評価し、有効期限のアラートを無料で送信します。