エラーメッセージ
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)から来ています。サーバーには何も送信されていません。
発生する理由
別のシステムからコピーした php.ini
よくある別のディストリビューション向けに書かれた curl.cainfo の行、Windows のパス、このイメージには一度もインストールされていないバンドルの指定などが該当します。
Windows:設定した cacert.pem が移動された、またはダウンロードされていない
よくあるPHP をアップグレードして新しいフォルダーに入れ替えた後も、curl.cainfo が古いインストール先を指したままになっていることがよくあります。
PHP のプロセスがファイルを読み取れない
ときどきPHP-FPM のワーカーは、シェルとは別のユーザーとして動作します。root だけが読み取れるバンドルは、そこでは失敗します。
修正方法
- 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.
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"