本文へスキップ
ecdsa.com
GNU Wget built with OpenSSL (Ubuntu 22.04+, Alpine, RHEL/CentOS)curl

エラーメッセージ

ERROR: cannot verify api.example.com's certificate, issued by 'CN=Example Private CA':

別の表記

  • Unable to locally verify the issuer's authority.

ホスト名と発行者の識別名はサイトごとに変わります。GnuTLS でビルドされた wget(Debian)は、同じ失敗を「ERROR: The certificate of '<host>' is not trusted.」と報告します。

このエラーの意味

wget の OpenSSL バックエンドがサーバー証明書を検証できませんでした。この証明書の発行者は「issued by」の後に引用されています。wget が次に出力するインデントされた行が、OpenSSL による理由です。「Unable to locally verify the issuer's authority」は、発行者がローカルの CA バンドルになく、サーバーもバンドル内の CA につながる証明書を送信しなかったことを意味します。wget は終了ステータス 5 で中断します。

発生する理由

修正方法

  1. 1.

    インデントされた理由の行を読む

    ERROR の下の行を見れば、OpenSSL のどのチェックが失敗したかがわかります。つまり、修正すべきなのが信頼、サーバーのチェーン、日付のどれなのかがわかります。

    text
    ERROR: cannot verify api.example.com's certificate, issued by 'CN=Example Private CA':
      Unable to locally verify the issuer's authority.     <- issuer unknown: CA or chain problem
      Self-signed certificate encountered.                 <- server certificate is self-signed
      Issued certificate has expired.                      <- date problem
  2. 2.

    wget に CA を指定する

    --ca-certificate でルート証明書(またはバンドル)を渡すか、~/.wgetrc または /etc/wgetrc で ca_certificate を設定してください。

    bash
    wget --ca-certificate=/opt/certs/corp-root-ca.pem https://api.example.com/
    echo 'ca_certificate = /opt/certs/corp-root-ca.pem' >> ~/.wgetrc
  3. 3.

    ルートをシステムのバンドルにインストールする

    OpenSSL ベースの wget はディストリビューションのバンドルを読み込むため、そこにルートを追加すれば、マシン上の wget、curl、その他ほとんどのツールが一度に直ります。

    bash
    # Ubuntu / Alpine
    sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates
    # RHEL / Fedora
    sudo cp corp-root-ca.pem /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust
  4. 4.

    サーバー管理者:完全なチェーンを返す

    発行者がパブリックな中間 CA の場合は、リーフ証明書に続けて中間証明書を並べたものをサーバーに設定してください。

    bash
    # Server side: serve leaf + intermediates
    cat api.example.com.crt intermediate.crt > fullchain.pem
  5. 5.

    一時的な診断:一度だけ検証をスキップする

    --no-check-certificate を使うと、それ以外の点でダウンロードが成功するかどうかを確かめられます。攻撃者の証明書も含めてどんな証明書でも受け入れるため、実行するものや信頼するものには使ってはいけません。

    bash
    # Diagnostic only
    wget --no-check-certificate -O /dev/null https://api.example.com/

関連するエラー

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