本文へスキップ
ecdsa.com
PHP ext-curl (Guzzle, Laravel HTTP client)PHP

エラーメッセージ

cURL error 77: error setting certificate file: /etc/ssl/missing-ca.pem

別の表記

  • error setting certificate file: /etc/ssl/missing-ca.pem

Guzzle はこれを「cURL error 77: error setting certificate file: <path> (see https://curl.se/libcurl/c/libcurl-errors.html) for <url>」という形式で出力し、curl_error() は「cURL error 77:」の後の部分を返します。ファイルが存在しない場合は、Guzzle 自身の verify オプションがそれより前の段階で「SSL CA bundle not found: <path>」となって失敗します。

PHP ext-curl (Guzzle, Laravel HTTP client) — CURLE_SSL_CACERT_BADFILE: curl.cainfo names a file that cannot be loaded

このエラーの意味

libcurl は、PHP から指定された CA バンドルを読み込めませんでした。そのため、ext-curl を経由する HTTPS リクエストは一切行えません。コロンの後のパスは、通常は php.ini の curl.cainfo(またはコードで設定した CURLOPT_CAINFO)から来ています。サーバーには何も送信されていません。

発生する理由

修正方法

  1. 1.

    設定箇所を見つけてファイルを確認する

    php --ini と php -i で、どのファイルが curl.cainfo を設定しているかがわかります。PHP を実行するユーザーから見てそのパスが存在するかを確認してください(FPM は CLI とは別の php.ini を読み込むことがあります)。

    bash
    php --ini
    php -i | grep -E 'curl.cainfo|openssl.cafile'
    ls -l "$(php -r 'echo ini_get("curl.cainfo");')"
  2. 2.

    curl.cainfo で実在するバンドルを指定する

    Linux ではディストリビューションのバンドルを、Windows では保守されている cacert.pem を使い、PHP-FPM または Web サーバーをリロードしてください。

    ini
    ; Linux (Debian/Ubuntu): the system bundle
    curl.cainfo = "/etc/ssl/certs/ca-certificates.crt"
    ; Windows: absolute path to an existing cacert.pem
    ; curl.cainfo = "C:\php\extras\ssl\cacert.pem"

関連するエラー

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