エラーメッセージ
curl: (77) error setting certificate file: /etc/pki/tls/certs/ca-bundle.crt
別の表記
- curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: /etc/ssl/certs
curl 7.81 以降は「error setting certificate file: <path>」(CA ディレクトリの場合は「error setting certificate path」)と出力します。curl 7.74 以前は「error setting certificate verify locations:」に続けて CAfile と CApath の値を出力していました。パスには、設定で指定されたものがそのまま表示されます。
curl (OpenSSL backend) — CURLE_SSL_CACERT_BADFILE
このエラーの意味
curl は使用するよう指定された CA バンドルを読み込めなかったため、HTTPS リクエストを一切行いません。サーバーには何も送信されていません。失敗は接続より前、curl がコロンの後に示されたファイルを読み込む段階で起きています。このパスは --cacert、CURL_CA_BUNDLE、SSL_CERT_FILE、.curlrc ファイル、または curl にコンパイル時に組み込まれたデフォルト値から来ています。
発生する理由
別のディストリビューション用のパス
よくあるRHEL 向けに書かれたスクリプト、Dockerfile、CI テンプレートは CURL_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt をエクスポートします。同じ行を Debian、Ubuntu、Alpine で使うと、そこには存在しないファイルを指すことになります(/etc/ssl/certs/ca-certificates.crt では逆のことが起きます)。
イメージに CA バンドルがインストールされていない
よくある最小構成のイメージでは ca-certificates パッケージが省かれていることが多く、その場合、curl にコンパイル時に組み込まれたデフォルトのパスは何も指していません。
ファイルは存在するが読み取れない
ときどきroot しか読み取れないバンドル、アップグレード後に壊れたシンボリックリンク、コピーの失敗で切り詰められた空のファイルは、いずれも同じメッセージになります。
相対パスが別のディレクトリを基準に解決されている
ときどき--cacert certs/ca.pem はプロジェクトのフォルダーでは動作しますが、cron ジョブ、systemd ユニット、CI のステップが別の作業ディレクトリから curl を実行すると失敗します。
修正方法
- 1.
パスの出どころを特定する
環境変数と ~/.curlrc に CA の設定がないかを確認し、curl -V で TLS ライブラリを確認してください。OpenSSL 版のビルドは CURL_CA_BUNDLE と SSL_CERT_FILE に従い、Schannel 版と Secure Transport 版のビルドは、別途指定しない限りシステムのストアを使います。
bash env | grep -E 'CURL_CA_BUNDLE|SSL_CERT_FILE|SSL_CERT_DIR' grep -sE 'cacert|capath' ~/.curlrc curl -V | head -1 # which TLS library this curl uses - 2.
このディストリビューションのバンドルパスを使うか、何も指定しない
ほとんどの場合、上書き設定を削除するのが正しい修正です。そうすれば curl は、パッケージのビルド時に設定されたバンドルパスを使います。独自のバンドルが必要な場合は、このシステム上に実在するファイルを指定してください。
bash # Debian, Ubuntu, Alpine: /etc/ssl/certs/ca-certificates.crt # RHEL, Fedora, Amazon Linux: /etc/pki/tls/certs/ca-bundle.crt # openSUSE: /etc/ssl/ca-bundle.pem unset CURL_CA_BUNDLE # let curl use the bundle it was built with ls -l /etc/ssl/certs/ca-certificates.crt - 3.
CA バンドルのパッケージをインストールする
slim 版や distroless 派生のイメージでは、ビルド時に ca-certificates を追加して、デフォルトのパスが存在するようにしてください。
bash apt-get install -y ca-certificates # Debian/Ubuntu apk add --no-cache ca-certificates # Alpine dnf install -y ca-certificates # RHEL/Fedora - 4.
ファイルを読み取り可能にし、絶対パスを使う
curl を実行するアカウントには、バンドルへの読み取り権限が必要です。絶対パスなら、作業ディレクトリが変わっても動作し続けます。
bash ls -l /opt/certs/bundle.pem sudo chmod 0644 /opt/certs/bundle.pem curl --cacert "$(realpath /opt/certs/bundle.pem)" https://api.example.com/
関連するエラー
curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)cURL error 77: error setting certificate file: /etc/ssl/missing-ca.pemPHP ext-curl (Guzzle, Laravel HTTP client)Warning: Ignoring extra certs from `/etc/ssl/private-ca/corp-root-ca.pem`, load…Node.js start-up