🛡️
🛡️ 【Laravel/PHP】FedEx API連携で cURL error 60: SSL certificate が出た時の対処法
FedEx API を Laravel で使っていると、以下のようなエラーが出ることがあります。
cURL error 60: SSL certificate problem: unable to get local issuer certificate
これは SSL 通信に必要な ルート証明書(CA証明書)が見つからないために発生します。この記事では、このエラーの原因と安全な対処法について解説します。
✅ 発生した環境
- Laravel 10.x
- PHP 8.x(Windows)
- FedEx Sandbox API:https://apis-sandbox.fedex.com/oauth/token
❓ なぜ発生する?
PHP の Http::post()
などで外部 API にアクセスする際、内部的に cURL が使用されます。その際、SSL 通信の安全性を検証するために ルート証明書(CA)ファイルが必要になります。
しかし Windows 版 PHP では、これがデフォルトで設定されていないことがあります。
💡 解決策:cacert.pem を指定する
cacert.pem
をダウンロード
✅ 手順1:以下の公式ページからルート証明書ファイル cacert.pem
をダウンロードします。
👉 https://curl.se/ca/cacert.pem
保存先の例:
C:\php\extras\ssl\cacert.pem
php.ini
にパスを設定
✅ 手順2:php.ini
をエディタで開き、以下のように設定を追加または修正します:
curl.cainfo = "C:\php\extras\ssl\cacert.pem"
openssl.cafile = "C:\php\extras\ssl\cacert.pem"
※パスにスペースがある場合は "..."
で囲んでください。
✅ 手順3:Webサーバーを再起動
Apache や PHP-FPM を使っている場合は再起動が必要です。
✅ 動作確認
PHP の Http::post()
が問題なく動作することを確認してください。
$response = Http::asForm()->post('https://apis-sandbox.fedex.com/oauth/token', [
'client_id' => 'your_client_id',
'client_secret' => 'your_client_secret',
'grant_type' => 'client_credentials',
]);
verify => false
は要注意
🚫 以下のように verify => false
を使う方法もありますが、本番環境では非推奨です。
$response = Http::withOptions(['verify' => false])->post(...);
通信の安全性が担保されず、中間者攻撃のリスクがあります。
✅ まとめ
対策方法 | 本番利用 | 安全性 |
---|---|---|
cacert.pem 設定 |
◎ | 安全 |
verify => false |
× | 非推奨 |
Laravel などで API 連携する場合、SSL証明書の検証は必須です。Windows 環境では特に見落とされやすいポイントなので、ぜひこの設定を見直してみてください。
💬 補足
- macOS や Linux では通常この問題は発生しません(OS にルート証明書が同梱されているため)。
- 本番サーバーを構築するときにも、この
curl.cainfo
の設定はチェックしておきましょう。
Discussion