🛡️

🛡️ 【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証明書)が見つからないために発生します。この記事では、このエラーの原因と安全な対処法について解説します。

✅ 発生した環境

❓ なぜ発生する?

PHP の Http::post()などで外部 API にアクセスする際、内部的に cURL が使用されます。その際、SSL 通信の安全性を検証するために ルート証明書(CA)ファイルが必要になります。

しかし Windows 版 PHP では、これがデフォルトで設定されていないことがあります。

💡 解決策:cacert.pem を指定する

✅ 手順1:cacert.pem をダウンロード

以下の公式ページからルート証明書ファイル cacert.pem をダウンロードします。
👉 https://curl.se/ca/cacert.pem
保存先の例:
C:\php\extras\ssl\cacert.pem

✅ 手順2:php.ini にパスを設定

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