エラーメッセージ
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 で中断します。
発生する理由
発行者がプライベート CA または社内 CA
よくある引用されている発行者が自組織の CA、または Kubernetes や Vault などのツールの CA であれば、そのルートはこのマシンの公開バンドルには含まれていません。
サーバーが中間証明書を送っていない
よくある発行者がパブリックな中間 CA(「R13」「GTS CA 1C3」「Sectigo RSA Domain Validation…」)であれば、サーバーがそれを送信していません。それがないと、OpenSSL はリーフ証明書を信頼済みのルートにつなげられません。
TLS インスペクションを行うプロキシが証明書を発行した
ときどき公開 Web サイトなのに、発行者名がセキュリティベンダーや自社のものであれば、プロキシが通信を再署名しています。そのプロキシのルートを、wget を実行するマシンにインストールしなければなりません。
CA バンドルが古い
まれ何年も ca-certificates を更新していないシステムには、新しい公開証明書のチェーンの先にあるルートが含まれていないことがあります。
修正方法
- 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.
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.
ルートをシステムのバンドルにインストールする
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.
サーバー管理者:完全なチェーンを返す
発行者がパブリックな中間 CA の場合は、リーフ証明書に続けて中間証明書を並べたものをサーバーに設定してください。
bash # Server side: serve leaf + intermediates cat api.example.com.crt intermediate.crt > fullchain.pem - 5.
一時的な診断:一度だけ検証をスキップする
--no-check-certificate を使うと、それ以外の点でダウンロードが成功するかどうかを確かめられます。攻撃者の証明書も含めてどんな証明書でも受け入れるため、実行するものや信頼するものには使ってはいけません。
bash # Diagnostic only wget --no-check-certificate -O /dev/null https://api.example.com/
関連するエラー
ERROR: The certificate of 'api.example.com' is not trusted.GNU Wget built with GnuTLS (Debian, Ubuntu before 22.04 used it too)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)verify error:num=20:unable to get local issuer certificateOpenSSL CLI (openssl s_client / openssl verify)