Laravel 11 中 cURL HTTPS 请求需显式配置 CA 证书路径(如 cacert.pem)并启用 CURLOPT_SSL_VERIFYPEER=true 和 CURLOPT_SSL_VERIFYHOST=2,推荐通过 php.ini 的 curl.cainfo 全局设置绝对路径以确保 Guzzle 等组件生效。

在 Laravel 11 中,cURL 的 CA 证书配置不是框架本身控制的,而是由底层 PHP 的 cURL 扩展和 libcurl 行为决定的。关键在于:PHP 不会自动使用系统证书库(尤其 Windows 或 Docker 环境),必须显式指定可信 CA 证书路径,否则调用 HTTPS 接口时大概率报错 curl: (60) SSL certificate problem: unable to get local issuer certificate。
必须同时开启并配对两个选项
仅设置证书路径不够,还需强制启用校验逻辑:
- CURLOPT_SSL_VERIFYPEER => true:要求验证服务器证书是否由可信 CA 签发
- CURLOPT_SSL_VERIFYHOST => 2:严格校验证书域名是否匹配请求地址(值为 2,不能是 1)
缺一不可。若只开 VERIFYPEER 而 VERIFYHOST 未设或设为 0/1,校验形同虚设;若两者都关,请求虽通但完全不防中间人攻击。
指定 CA 证书文件路径(CURLOPT_CAINFO)
推荐使用 Mozilla 官方维护的 cacert.pem,从 https://www.php.cn/link/cd6a3674478af373087f891eeb390100 下载最新版,保存到项目目录(如 storage/certs/cacert.pem)。
在发起 cURL 请求前设置绝对路径:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
⚠️ 注意:必须用绝对路径。相对路径、dirname(__FILE__) 拼接后未经 realpath() 解析,极易因工作目录变化导致文件找不到。
全局生效:通过 php.ini 配置 curl.cainfo
更省心的方式是让所有 cURL 请求默认信任该证书包:
- 编辑
php.ini,添加一行(路径需为绝对路径):
curl.cainfo = "/var/www/your-laravel/storage/certs/cacert.pem" - Windows 下路径示例:
curl.cainfo = "C:\laravel\storage\certs\cacert.pem" - 修改后务必重启 Web 服务器(Apache/Nginx + PHP-FPM)或 CLI 环境
该配置等效于每次调用都自动设置了 CURLOPT_CAINFO,且对 Laravel 内部使用的 HTTP 客户端(如 Guzzle)也有效(Guzzle 底层仍走 cURL)。
私有环境或自签名证书的处理
对接测试 API、内网服务或企业私有 CA 时,不能关闭校验,而应把对应根证书加入信任链:
- 将自签名证书(
server.crt)或私有 CA 根证书(internal-ca.crt)单独保存 - 在 cURL 设置中直接指向它:
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/certs/internal-ca.crt'); - 也可合并进
cacert.pem文件末尾(PEM 格式,多个证书可追加)
跳过验证(CURLOPT_SSL_VERIFYPEER => false)仅限本地调试,生产环境严禁使用。

















