php 的 file_get_contents 请求 https 失败,90% 是 openssl 未正确配置或缺少可信 ca 证书;应配置 php.ini 中的 openssl.cafile 指向有效 cacert.pem 文件并重启服务。

直接说结论:PHP 的 file_get_contents 请求 HTTPS 地址失败,90% 是因为 OpenSSL 未正确配置或系统缺少可信 CA 证书,不是代码写错了。
为什么 file_get_contents 访问 HTTPS 会报错?
常见错误信息包括:SSL operation failed with code 1、Unable to set private key file、certificate verify failed。根本原因不是 PHP 版本太低,而是 PHP 运行时无法验证远程服务器的 SSL 证书——它找不到或读不了系统的 CA 证书包。
- Windows 下 PHP 默认不带 CA 证书,
openssl.cafile为空 - Linux/macOS 上虽然可能有系统证书(如
/etc/ssl/certs/ca-certificates.crt),但 PHP 的openssl.cafile或curl.cainfo没指向它 - 某些旧版 PHP(如 5.6 以前)默认不校验证书,升级后反而暴露问题
最稳妥的修复方式:配置 openssl.cafile
不是改代码绕过验证,而是让 PHP 能真正验证证书——安全且兼容性好。
- 下载最新 CA 证书包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为
/path/to/cacert.pem(Linux/macOS 推荐/usr/local/etc/php/cacert.pem,Windows 可放 PHP 安装目录下) - 在
php.ini中添加或修改:openssl.cafile="/path/to/cacert.pem"
- 重启 Web 服务或 PHP-FPM,用
php -i | grep openssl确认生效 - 之后
file_get_contents('https://example.com')就能正常工作
临时调试可用的上下文参数(不推荐上线)
仅限开发环境快速验证是否是证书问题,绝不能用于生产:
立即学习“PHP免费学习笔记(深入)”;
- 用
stream_context_create关闭证书校验:$ctx = stream_context_create(['http' => ['ignore_errors' => true, 'timeout' => 5]]);<br>$ctx = stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]);<br>file_get_contents('https://example.com', false, $ctx); - 注意:
verify_peer_name必须和verify_peer同时设为false,否则仍会报错 - 这样会失去 HTTPS 的身份认证和防中间人能力,上线前必须撤掉
其他容易被忽略的点
有些问题看似是 SSL,实则卡在更底层:
- PHP 编译时没启用 OpenSSL(检查
php -m | grep openssl是否有输出) - SELinux 或 AppArmor 限制了 PHP 进程读取证书文件(Linux 上可临时
setenforce 0测试) - 某些企业网络代理会替换 HTTPS 证书,此时需把代理的根证书加入
cacert.pem -
allow_url_fopen=Off会导致file_get_contents直接拒绝所有 URL,先确认这个配置是On
CA 证书路径配错比代码逻辑错更难排查——它不报路径错误,只默默失败。建议把 cacert.pem 放绝对路径,并用 file_exists() 在代码里主动检查一次。











