PHP cURL 解决 HTTPS SSL 证书验证失败的两种方法
在使用 PHP 的 cURL 库发起 HTTPS 请求时,如果目标服务器的 SSL 证书不被本地信任或本地 CA 证书文件过期,程序会抛出 "SSL certificate problem" 错误。本文将详细说明如何通过关闭验证和配置正确的 CA 证书这两种方式来解决问题。
错误现象
当执行 cURL 请求时,如果出现以下错误信息,说明 SSL 证书验证未通过:
SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
解决方法
第1步:方法一 - 禁用 SSL 证书和主机名验证(仅限调试/内网使用)
目的: 快速绕过 SSL 验证以测试连接是否正常。此方法会降低安全性,不建议在生产环境中对公开网站使用。
操作: 在初始化 cURL 后、执行请求前,设置两个选项为 FALSE。
$ch = curl_init();
// ... 其他配置 ...
// 禁止验证SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// 禁止验证SSL主机名
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
完成状态: 再次运行代码,只要网络通畅且目标服务器无其他阻断,请求应能正常返回,不再报证书错误。
第2步:方法二 - 配置正确的 CA 证书路径(推荐用于生产环境)
目的: 保持 SSL 验证开启的同时,使用最新的证书颁发机构列表来验证服务器证书,确保通信安全。
准备条件:
- 需要下载最新的
ca-bundle.crt或cacert.pem文件。官方下载地址:http://curl.haxx.se/ca/cacert.pem - 将该文件放置在项目目录中(例如与脚本同级的目录下)。
操作:
- 确保
CURLOPT_SSL_VERIFYPEER设置为true(这是默认值,若之前设为 false 需改回)。 - 使用
CURLOPT_CAINFO指定新下载的证书文件路径。
$ch = curl_init();
// ... 其他配置 ...
// 开启SSL验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
// 指定CA证书路径,dirname(__FILE__)获取当前脚本所在目录
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/cacert.pem');
注意事项:
- 旧版本的 PHP 或 cURL 可能包含过时的 CA 证书包,导致即使代码正确仍报错。此时手动更新
cacert.pem是必要的。 - 如果不确定路径是否正确,建议打印出
dirname(__FILE__).'/cacert.pem'的实际输出进行确认。
以上两种方法可根据实际需求选择。对于涉及敏感数据或正式业务场景,强烈推荐使用方法二。
以上就是PHP cURL解决HTTPS SSL证书验证失败的详细内容,更多关于PHP cURL HTTPS开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













