根本原因是php curl扩展未配置ca根证书路径,导致无法验证https证书链;需在php.ini中设置curl.cainfo指向有效cacert.pem文件并重启服务。

PHP cURL 请求百度 API 时提示 cURL error 60: SSL certificate problem: unable to get local issuer certificate,根本原因不是百度的问题,而是你本地 PHP 的 OpenSSL 不知道该信任谁——它默认启用证书校验,但没配好 CA 根证书路径。
为什么 curl 命令能通,PHP 却报错
终端里 curl https://api.baidu.com 成功,不代表 PHP 的 curl 扩展也成功。两者加载的 CA 证书来源不同:
- 系统
curl通常信任 macOS Keychain / Linux/etc/ssl/certs或已预置的 ca-bundle - PHP 的
ext-curl默认不自动读取系统 CA 路径,尤其 Homebrew 安装的 PHP(macOS M1/M2 常见)或 Windows 下的 WAMP/XAMPP 往往压根没设curl.cainfo - 百度 API 使用的是标准可信 CA(如 GlobalSign、DigiCert),问题出在“你本地 PHP 找不到验证链”,而非证书无效
修改 php.ini 中的 curl.cainfo 配置
这是最直接、影响全局且无需改业务代码的修复方式。找到你 CLI 和 Web SAPI 共用的 php.ini(用 php --ini 确认路径),添加或取消注释:
curl.cainfo = "/usr/local/etc/openssl/cert.pem"(macOS Homebrew)curl.cainfo = "/etc/ssl/certs/ca-certificates.crt"(Ubuntu/Debian)curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"(Windows XAMPP)
如果你不确定系统 CA 路径,稳妥做法是手动下载并指定:
- 访问
https://curl.se/ca/cacert.pem下载最新cacert.pem - 保存到一个固定位置,例如
/opt/php-ca/cacert.pem - 在
php.ini中写死该路径:curl.cainfo = "/opt/php-ca/cacert.pem" - 改完必须重启 PHP-FPM 或 Apache/Nginx,CLI 模式需重新开终端
Symfony HttpClient 层面临时绕过(仅限开发)
不推荐生产使用,但调试阶段可快速验证是否为证书问题:
- 在创建客户端时禁用证书校验:
HttpClient::create(['verify_host' => false, 'verify_peer' => false]) - 注意:这会让整个请求失去 TLS 完整性保护,绝对不能用于生产环境
- 更安全的替代是只跳过验证但保留加密:
['verify_peer' => true, 'cafile' => '/path/to/cacert.pem'],即显式指定证书路径 - 若用 Mercure 或其他 Symfony 组件内部调用百度 API,它们底层也走 HttpClient,所以统一配置
php.ini更可靠
验证是否真正生效
别只看浏览器或 Postman 是否能通——它们走的是系统网络栈,和 PHP 无关。执行以下命令确认:
php -r "print_r(file_get_contents('https://api.baidu.com/oauth/2.0/token'));"
如果仍报错 SSL certificate problem,说明 php.ini 没生效或路径写错;如果返回空或 JSON 错误(如 missing params),说明证书层已通,问题转向百度 API 接口逻辑本身。
最容易被忽略的是:CLI 和 Web SAPI 使用的 php.ini 往往不是同一个文件,php --ini 和 phpinfo() 输出的路径必须分别核对。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











