curl error 60错误本质是php curl缺少可信ca证书,推荐方案为下载cacert.pem并配置php.ini中curl.cainfo和openssl.cafile指向该文件路径,重启服务后生效;次选项目级通过guzzle的verify选项指定证书路径;禁用验证(verify=false)仅限开发测试,严禁生产使用。

在 Laravel 9 中使用 cURL(比如通过 GuzzleHttp 发起 HTTPS 请求)时出现证书验证失败,典型错误是:cURL error 60: SSL certificate problem: unable to get local issuer certificate。这本质不是 Laravel 的问题,而是 PHP 的 cURL 扩展找不到可信的 CA 根证书来验证目标网站的 HTTPS 证书。解决方向很明确:让 PHP 知道去哪找有效的证书文件,或在可控前提下临时绕过验证。
配置 php.ini 指向可信 CA 证书(推荐)
这是最安全、一劳永逸的方式,适用于本地开发环境(如 PHPStudy、XAMPP、WAMP)和 Linux 服务器:
- 从权威地址下载最新 CA 证书包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251(直接保存为
cacert.pem) - 将该文件放到一个固定路径,例如:
Windows:D:phpextrassslcacert.pem
Linux:/etc/ssl/certs/cacert.pem - 编辑你的
php.ini文件,添加或修改两行(路径必须是绝对路径,且注意反斜杠转义):curl.cainfo="D:\php\extras\ssl\cacert.pem"openssl.cafile="D:\php\extras\ssl\cacert.pem" - 保存后,**重启 Web 服务(Apache/Nginx)和 PHP-FPM(如使用)**,否则配置不生效
在 Guzzle 请求中单独指定证书路径(项目级灵活控制)
如果你不想全局改 php.ini(比如共享主机无权限),或者只想对特定请求启用证书验证,可在 Laravel 9 的 Guzzle 客户端调用中显式传入证书路径:
父母的功课——育儿心理学对话支持技能(心虫增强版)。提供结构化对话、情绪识别、场景匹配与安全检测;可选Python脚本(scripts/)在SKILL_DIR/data/本地存储评估历史、洞察与会话状态,不对外传输。核心路径:觉察(看见防御)→接纳(慈悲是……
- 确保你已下载好
cacert.pem并放在项目目录下,例如:storage/app/cacert.pem - 发起请求时传入
verify选项:$response = Http::withOptions([ 'verify' => storage_path('app/cacert.pem') ])->get('https://api.example.com'); - 若用原生 GuzzleClient 实例,写法类似:
$client = new GuzzleHttpClient([ 'verify' => storage_path('app/cacert.pem') ])
临时禁用 SSL 验证(仅限开发/测试)
绝对不要在生产环境使用。它会跳过全部证书校验,使请求暴露在中间人攻击风险中:
- Laravel 的
Http门面:$response = Http::withOptions(['verify' => false])->get('https://api.example.com'); - GuzzleClient 实例:
$client = new GuzzleHttpClient(['verify' => false]);
- 命令行 curl 测试时可用:
curl -k https://example.com
检查与确认是否生效
改完配置别急着写业务代码,先快速验证一下:
- 新建一个 Artisan 命令或在 Tinker 中执行:
Http::get('https://httpbin.org/get')->status(); // 应返回 200 - 查看当前 PHP 的 cURL 配置:
php -i | grep -i "curl.cainfo|openssl.cafile"
确保输出显示的是你刚配置的路径,且文件真实存在、可读 - 如果仍报错,检查文件权限(Linux/macOS)、路径中的中文或空格、以及是否重启了服务










