本文へスキップ
ecdsa.com
curl (OpenSSL backend)curl

エラーメッセージ

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 にコンパイル時に組み込まれたデフォルト値から来ています。

発生する理由

修正方法

  1. 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. 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. 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. 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/

関連するエラー

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