本文へスキップ
ecdsa.com
GNU Wget built with GnuTLS (Debian)curl

エラーメッセージ

ERROR: The certificate of 'api.example.com' has expired.

GnuTLS でビルドされた wget は、この行を、汎用的な「ERROR: The certificate of '<host>' is not trusted.」の後、「The certificate has expired」の前に出力します。OpenSSL でビルドされたものは、「ERROR: cannot verify <host>'s certificate, issued by '…':」に続けて「Issued certificate has expired.」を出力します。

このエラーの意味

このマシンの時計で見ると、サーバーの証明書(またはそのチェーン内の別の証明書)が notAfter の日付を過ぎているため、wget の GnuTLS バックエンドが接続を拒否しています。CA は信頼されており、問題は有効期間だけです。wget は終了ステータス 5 で終了します。

発生する理由

修正方法

  1. 1.

    実際に返されている証明書の日付を確認する

    notAfter を現在の UTC 時刻と比較してください。返されている証明書が古く、新しい証明書が存在する場合は、サーバーがまだ新しい証明書を読み込んでいません。

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -subject -startdate -enddate
  2. 2.

    更新してリロードする

    ACME クライアントまたは CA を通じて更新し、その名前の TLS を終端しているサービスをすべてリロードしてください。次回の更新が誰かの記憶に頼らずに済むよう、両方の手順を自動化してください。

    bash
    sudo certbot renew --cert-name api.example.com
    sudo systemctl reload nginx     # or apache2 / haproxy: reload whatever terminates TLS
  3. 3.

    クライアントの時刻を直す

    別のマシンから確認して証明書が有効であれば、失敗しているマシンで NTP を有効にしてください。

    bash
    date -u
    timedatectl status
    sudo timedatectl set-ntp true

関連するエラー

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