Laravel7用Guzzle调HTTPS接口报cURL60自签证书错 配cacert仍无效
问题复现场景
- 运行栈:XAMPP 7.4.5 环境下的 Laravel 7 项目,调用同机SLIM框架开发的本地接口
- 正常表现:HTTP协议的GET接口
localhost/events_platforma/view/users可正常访问 - 异常表现:HTTPS协议的POST接口
https://localhost/events_platforma/register请求返回cURL error 60: SSL certificate problem: self signed certificate - 已尝试操作:在php.ini中配置cacert.pem证书路径,配置内容存在语法错误:
curl.cainfo = curl.cainfo="C:\xampp\php\extras\ssl\cacert.pem"
配置加载后错误依旧存在。
错误核心原因
- 语法问题导致配置不生效:php.ini配置行重复写了curl.cainfo键名,cURL无法正确解析证书路径,实际未加载到指定的cacert.pem文件
- 证书信任逻辑不匹配:你配置的cacert.pem是公共可信CA的根证书列表,仅能校验公网受信任网站的SSL证书,无法识别XAMPP为本地环境生成的、仅对localhost生效的自签名证书
可落地的解决方法
本地开发临时方案
仅测试环境使用,禁止上线
直接在Guzzle初始化时关闭SSL证书校验,跳过自签证书的校验环节:
- 全局配置方式:在
config/services.php中补充Guzzle默认配置
'guzzle' => [ 'verify' => false, 'timeout' => 10, ]
- 单次请求配置方式:每次初始化Guzzle客户端时单独传参
$guzzle = new \GuzzleHttp\Client([ 'verify' => false ]); // 发起请求示例 $res = $guzzle->post('https://localhost/events_platforma/register', [ 'form_params' => ['字段1' => '值1'] ]);
规范配置方案(贴近线上生产校验逻辑)
如果不想全局关闭证书校验,可以手动让cURL信任本地的自签证书,流程如下:
- 修正php.ini的错误配置:打开
C:\xampp\php\php.ini,把原来重复键的行替换成正确的配置,同时补充openssl的证书路径配置:
curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem" openssl.cafile = "C:\xampp\php\extras\ssl\cacert.pem"
修改完成后重启XAMPP的Apache服务,通过phpinfo()确认配置已生效(检查curl.cainfo和openssl.cafile的输出路径和配置一致)
2. 定位XAMPP本地的自签服务端证书,一般文件路径为C:\xampp\apache\conf\ssl.crt\server.crt
3. Guzzle初始化时指定该自签证书作为校验信任根:
$guzzle = new \GuzzleHttp\Client([ 'verify' => 'C:\xampp\apache\conf\ssl.crt\server.crt' ]);
注意:生产环境必须开启证书校验,避免中间人攻击风险。
内容的提问来源于stack exchange,提问作者NgatungaEmily
相关产品推荐
相关产品推荐

