结论是php curl因缺失可信根证书导致ssl验证失败,应配置curl.cainfo与openssl.cafile指向有效cacert.pem路径(推荐),或仅调试时设verify=>false;须检查配置文件路径、注释、权限、时间及phpinfo生效状态。

直接说结论:这不是代码写错了,是 PHP 的 cURL 找不到可信的根证书来验证 HTTPS 网站身份。修复核心就两条路——要么给它一个靠谱的证书包(推荐),要么让它别验(仅限调试)。
curl.cainfo 配置没生效?检查这三处
很多情况下改了 php.ini 却没用,是因为:
-
php --ini输出的配置文件路径和你编辑的不是同一个(常见于多版本 PHP 或 CLI / Web SAPI 使用不同 ini) -
curl.cainfo前面还有;注释没删掉 - 没同时配
openssl.cafile(某些 PHP 版本或 OpenSSL 组合下,只设curl.cainfo不够)
建议在 php.ini 里一起加上:
curl.cainfo = "/etc/ssl/certs/cacert.pem" openssl.cafile = "/etc/ssl/certs/cacert.pem"
Linux 下可放在 /etc/ssl/certs/,Windows 下推荐放 PHP 安装目录下的 extras\ssl\ 子目录。改完必须重启 PHP-FPM 或 Apache/Nginx。
ThinkPHP / Guzzle 请求时 verify 参数怎么填
如果你用的是 ThinkPHP 的 \think\facade\Http 或 Guzzle(如腾讯云 SDK、微信支付 SDK),它们底层都走 cURL,但会封装一层参数。关键点:
父母的功课——育儿心理学对话支持技能(心虫增强版)。提供结构化对话、情绪识别、场景匹配与安全检测;可选Python脚本(scripts/)在SKILL_DIR/data/本地存储评估历史、洞察与会话状态,不对外传输。核心路径:觉察(看见防御)→接纳(慈悲是……
-
'verify' => false是临时跳过校验,绝对不要在生产环境用 -
'verify' => '/path/to/cacert.pem'必须是绝对路径,相对路径会静默失败 - ThinkPHP 6.3+ 中,
Http::get()的第二个参数就是选项数组,直接传即可
示例:
$res = \think\facade\Http::get('https://api.weixin.qq.com/cgi-bin/token', [
'verify' => '/var/www/cert/cacert.pem'
]);
为什么下载的 cacert.pem 还是报错?
常见原因不是证书旧,而是:
- 证书文件权限不对(Linux 下 PHP 进程用户读不到,比如 www-data 没权限读
/root/cacert.pem) - 路径中有中文或空格,且没加引号(Windows 下尤其容易出事)
- 系统时间偏差超过几分钟——SSL 证书有有效期,时间错乱会导致“证书尚未生效”或“已过期”,表现为同样错误
- 用了自建 CA 或内网 HTTPS 服务,而
cacert.pem不包含该私有根证书(这时需把内网 CA 的 .pem 合并进去,或单独指定)
验证是否真加载成功,可临时加一行:var_dump(curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT));,返回 0 表示验证通过。
最常被忽略的一点:改完 php.ini 后,一定要确认 phpinfo() 页面里 curl.cainfo 和 openssl.cafile 显示的路径跟你填的一致,且不是 no value。否则一切配置都是白忙。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










