GuzzleHttp Exception cURL error 60: SSL certificate problem: unable to get local

Ubuntu 20.04 安装 Composer 2.5 全流程指南与避坑手册 Composer 是 PHP 生态的核心包管理器,其本质是基于 PHP 运行时与系统工具链(curl、unzip、git)协同工作的依赖解析引擎。理解其原理需把握三个关键层:PHP 扩展依赖(如 openssl、proc_open)、系统级权限模型(如 COMPOSER_HOME 和 /usr/local/bin 冲突)、以及网络策略影响(如 CA 证书、TLS 版本、镜像源)。在 Ubuntu 20.04 这一广泛使用的 LTS 系统中,Composer 2.5 的稳定部署面临 OpenSSL 缺失、ap 阅读详情

前言

有一位同事在做本地开发的时候遇到了如下报错:

GuzzleHttp Exception cURL error 60: SSL certificate problem: unable to get local

开发环境:

  • PHP7.2.1
  • Win7
  • phpstudy

终是在上网找到了解决方案,但不知其所以然。

问题所在

GuzzleHttp 在初始化配置时,默认 verify = true。

// FILE: guzzlehttp/guzzle/src/Client.php
/**
 * Configures the default options for a client.
 *
 * @param array $config
 * @return void
 */
private function configureDefaults(array $config)
{
    /**
     * 这里的 verify 默认设置的是 true
     */
    $defaults = [
        'allow_redirects' => RedirectMiddleware::$defaultSettings,
        'http_errors'     => true,
        'decode_content'  => true,
        'verify'          => true,
        'cookies'         => false,
        'idn_conversion'  => true,
    ];
    ...
}

在后续 curl 的配置中,根据 verify 初始化了 CURLOPT_SSL_VERIFYHOST、CURLOPT_SSL_VERIFYPEER 两个变量。

// FILE: guzzlehttp/guzzle/src/Handler/CurlFactory.php
private function applyHandlerOptions(EasyHandle $easy, array &$conf)
{
    $options = $easy->options;
    if (isset($options['verify'])) {
        if ($options['verify'] === false) {
            unset($conf[CURLOPT_CAINFO]);
            $conf[CURLOPT_SSL_VERIFYHOST] = 0;
            $conf[CURLOPT_SSL_VERIFYPEER] = false;
        } else {
            $conf[CURLOPT_SSL_VERIFYHOST] = 2;
            $conf[CURLOPT_SSL_VERIFYPEER] = true;
            if (is_string($options['verify'])) {
                // Throw an error if the file/folder/link path is not valid or doesn't exist.
                if (!file_exists($options['verify'])) {
                    throw new \InvalidArgumentException(
                        "SSL CA bundle not found: {$options['verify']}"
                    );
                }
                // If it's a directory or a link to a directory use CURLOPT_CAPATH.
                // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
                if (is_dir($options['verify']) ||
                    (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {
                    $conf[CURLOPT_CAPATH] = $options['verify'];
                } else {
                    $conf[CURLOPT_CAINFO] = $options['verify'];
                }
            }
        }
    }
	...
}

由于 CURLOPT_SSL_VERIFYPEER = true 且 CURLOPT_SSL_VERIFYHOST > 0,那就需要 验证SSL证书。

下面一段解释内容来源于:传送门

并非所有的系统磁盘上都存在 CA包,比如,Windows 和 OS X 并没有通用的本地 CA包。 当设置 verify 为 true 时,Guzzle 将尽力在你的操作系统中找到合适的 CA包, 当使用 cURL 或 PHP 5.6 以上版本的流时,Guzzle 将按以下顺序尝试查找CA包:

  • 检查php.ini文件中是否设置了 openssl.cafile。
  • 检查php.ini文件中是否设置了 curl.cainfo。
  • 检查 /etc/pki/tls/certs/ca-bundle.crt 是否存在 (Red Hat, CentOS, Fedora; 由 ca-certificates 包提供)
  • 检查 /etc/ssl/certs/ca-certificates.crt 是否存在 (Ubuntu, Debian; 由 ca-certificates 包提供)
  • 检查 /usr/local/share/certs/ca-root-nss.crt 是否存在 (FreeBSD; 由 ca_root_nss 包提供)
  • 检查 /usr/local/etc/openssl/cert.pem 是否存在 (OS X; 由 homebrew 提供)
  • 检查 C:\windows\system32\curl-ca-bundle.crt 是否存在 (Windows)
  • 检查 C:\windows\curl-ca-bundle.crt 是否存在 (Windows)

查询的结果将缓存在内存中,以便同一进程后续快速调用。 然而在有些服务器如 Apache 中每个请求都在独立的进程中,你应该考虑设置 openssl.cafile 环境变量,指定到磁盘文件,以便整个过程都跳过。

具体代码如下:

/**
 * Returns the default cacert bundle for the current system.
 *
 * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
 * If those settings are not configured, then the common locations for
 * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
 * and Windows are checked. If any of these file locations are found on
 * disk, they will be utilized.
 *
 * Note: the result of this function is cached for subsequent calls.
 *
 * @return string
 * @throws \RuntimeException if no bundle can be found.
 */
function default_ca_bundle()
{
    static $cached = null;
    static $cafiles = [
        // Red Hat, CentOS, Fedora (provided by the ca-certificates package)
        '/etc/pki/tls/certs/ca-bundle.crt',
        // Ubuntu, Debian (provided by the ca-certificates package)
        '/etc/ssl/certs/ca-certificates.crt',
        // FreeBSD (provided by the ca_root_nss package)
        '/usr/local/share/certs/ca-root-nss.crt',
        // SLES 12 (provided by the ca-certificates package)
        '/var/lib/ca-certificates/ca-bundle.pem',
        // OS X provided by homebrew (using the default path)
        '/usr/local/etc/openssl/cert.pem',
        // Google app engine
        '/etc/ca-certificates.crt',
        // Windows?
        'C:\\windows\\system32\\curl-ca-bundle.crt',
        'C:\\windows\\curl-ca-bundle.crt',
    ];

    if ($cached) {
        return $cached;
    }

    if ($ca = ini_get('openssl.cafile')) {
        return $cached = $ca;
    }

    if ($ca = ini_get('curl.cainfo')) {
        return $cached = $ca;
    }

    foreach ($cafiles as $filename) {
        if (file_exists($filename)) {
            return $cached = $filename;
        }
    }

    throw new \RuntimeException(
        <<< EOT
No system CA bundle could be found in any of the the common system locations.
PHP versions earlier than 5.6 are not properly configured to use the system's
CA bundle by default. In order to verify peer certificates, you will need to
supply the path on disk to a certificate bundle to the 'verify' request
option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not
need a specific certificate bundle, then Mozilla provides a commonly used CA
bundle which can be downloaded here (provided by the maintainer of cURL):
https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once
you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP
ini setting to point to the path to the file, allowing you to omit the 'verify'
request option. See http://curl.haxx.se/docs/sslcerts.html for more
information.
EOT
    );
}

结语

在没有需要检查证书需求的前提下,并且是直接引用的 GuzzleHttp 包,可以在初始化是,指定 verify = false。
反之,还是老老实实的将证书放在该放置的地方吧。

CAN开发笔记(TI开发者推荐笔记) 查阅了很多资料没有查阅到关于5728芯片CAN模块寄存器的介绍,希望通过本文能给做CAN驱动的后来者有一点参考意义,我也是刚接触CAN模块有些不足请各位多多指正。 由下图所示是CAN模块初始化流程图 首先要开始初始化,设置CAN位时间,然后配置message objects, 完成初始化。 1.开始初始化 首先要控制DCAN_CTL 寄存器,该寄存器是CAN模块的总控制器,很多配置通过... 阅读详情

相关推荐

顶级的FDE需要拥有哪些技能?

上一篇《》说明白了什么是FDE。这一篇回答下一个问题:要成为顶级 FDE,需要哪些具体的技能?要想弄清楚FDE应该有哪些能力,就得先搞清楚FDE要完成哪些工作。同时,有一点是我们要密切关注的:现在是大模型时代,所以我们不能脱离大模型讨论FDE的能力。我们可以把FDE在客户现场需要完成的工作分为四类:破冰与诊断、价值交付、项目与预期管理、沟通与影响。另有两项元能力贯穿始终。以下按工作类别逐一拆解,每项能力配 1 / 3 / 5 分标准,方便对照自评。文末有完整打分工具链接。

mydeman的学习日志 260

解决 Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 60

解决 Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 60

qq_41803556的博客 3200

保姆级教程:在RV1126开发板上跑通YOLOv5口罩检测(从数据集到摄像头实时识别)

本文提供了一份详细的RV1126开发板部署YOLOv5口罩检测系统的全流程指南,涵盖数据集准备、模型训练优化、边缘部署及实时摄像头识别等关键步骤。重点解析了RV1126开发板的性能特征、YOLOv5模型训练调优技巧、RKNN模型转换量化策略,以及部署过程中的性能优化方案,帮助开发者高效实现边缘端目标检测应用。

weixin_27310985的博客 108

[GuzzleHttp\Exception\RequestException] cURL error 60: SSL certificate problem: unable to get local

在执行终端执行php symfony demo命令时报错,下载失败: [GuzzleHttp\Exception\RequestException] cURL error 60: SSL certificate problem: unable to get local 解决方法: 在这个链接下载cacert.pem文件,将这个文件放在随便什么地方(例如D:\cacert.pem),打...

sinat_35162715的博客 3853

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3408

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 567

php curl error 60,Guzzle cURL error 60 问题解决办法

Fatalerror:UncaughtGuzzleHttp\Exception\RequestException:cURL error60:SSL certificate problem:unable togetlocalissuer certificate(see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in E:\project\m...

weixin_39941792的博客 1410

OpenOCD入门到精通:第 0 章 教程导读

摘要:本教程是OpenOCD嵌入式调试工具的完整指南,适合从新手到资深工程师的学习需求。内容涵盖基础配置、调试技巧、Flash编程、TCL脚本自动化、源码解析和二次开发,共8大部分30章。教程提供5种学习路线,可根据角色和目标灵活选择,配套资源包含示例代码和配置文件。通过系统学习,读者将掌握OpenOCD从使用到扩展的全套技能,成为嵌入式调试领域的专家。

从事嵌入式linux android驱动开发,拥有全栈能力 1940

关于curl发送请求报错证书问题:curl: (60) SSL certificate problem: unable to get local issuer certificate

php curl 发送https请求报错问题

changzhen5616的博客 2130

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2793

朱长江《偏微分方程简明教程》答案第一章部分

偏微分方程简明教程第一章习题1.1 第一章 习题1.1 1、指出下列方程的阶,并判断它是线性的还是非线性的。如果是线性的,说明它还是其次的: (1)ut−(uxx+uyy)+1=0;(2)ut−uxx+xu=0;(3)ut−uxxt+uux=0;(4)ux2+uuy=0;(5)utt−uxx+t2+x2=0;(6)ux+eyuy=0;(7)ut+uxxxx+1+u=0;(8)ux(1+ux2)−12+uy(1+uy2)−12=0;(9)∂4u∂x4+2∂4u∂x2∂y2+∂4u∂y4=0;(10)∂3u∂x

ymengm的博客 6760

php GuzzleHttp 报cURL error 60: SSL certificate problem:

在php.ini配置文件[curl]下加入。

weixin_42261759的博客 736

Qt/C++编写自定义控件42-开关按钮

一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。 总结了大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,但是灵活性比较好...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 3327

PHP cURL接口调试与SSL问题排查指南

cURL作为PHP中处理HTTP请求的核心扩展,其底层基于libcurl库实现网络通信。在HTTPS请求场景下,SSL/TLS协议握手过程涉及证书验证、协议版本协商等关键环节。当出现接口调用失败时,开发者需要掌握从网络层到应用层的系统排查方法,特别是SSL证书验证错误、DNS解析异常等常见问题。通过合理设置CURLOPT_SSL_VERIFYPEER等参数可以解决60%以上的HTTPS连接问题,而连接复用技术和并发请求处理则能显著提升API调用效率。本文整理的真实案例库覆盖了从400错误到慢速连接等典型故障

chulilang8944的博客 367

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

CRMEB小程序订阅消息静默失败的全链路排查与生产加固

微信小程序订阅消息是实现用户触达的关键能力,其底层依赖HTTPS通信、用户授权、模板ID合规性及服务端精准调用等多重技术环节。当出现‘已授权却无推送’现象时,问题往往不在业务逻辑本身,而深藏于PHP运行环境的SSL证书配置、cURL底层行为、微信凭证加载污染、Guzzle超时策略及字段类型校验等基础设施层。本文围绕CRMEB这一典型Laravel电商系统,系统梳理从网络连通性、凭证有效性、参数合规性到终端授权状态的四级穿透式诊断方法,并提供异步队列化、熔断降级与灰度开关三大生产级加固实践,助力开发者将订阅消

weixin_34059951的博客 325

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口,报错:certificate has expired 因为在linux centos环境与window环境有所不同,在此记录一下解决过程。

json_li的博客 5043

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

PHP配置默认SSL CA证书,curl访问https地址错误cURL error 60

问题描述 项目中使用GuzzleHttp请求 https 时会报错: GuzzleHttp\Exception\RequestException : cURL error 60: SSL certificate problem: certificate has expired (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)’ 下载新的CA证书 官网地址:https://curl.se/docs/caextract.html 下载地址:h

Climber813 1719

php 调用Guzzle 访问https接口报错 cURL error 60: SSL certificate problem...

错误原因:Ubuntu系统中CA证书过期或不可用。

hanzengyi的专栏 871

php 使用guzzle发送异步的HTTP请求

php 使用guzzle发送异步的HTTP请求

weixin_49039924的博客 3266

cURL error 60: SSL certificate problem: unable to get local issuer certifica 解决

无法获取本地颁发者证书Windows版本linux版本解决方案cURL error 60: SSL certificate problem: unable to get local issuer certifica 解决Laravel 使用GuzzleHttp请求第三方https接口报错获取 headerswindows 清晰版本 Windows版本 1.到 https://curl.haxx.se/ca/cacert.pem 下载证书文件 cacert.pem,将其保存到 PHP 安装路径下。 2.编辑

wgchen 3万+

XMPP cURL error 60: SSL certificate problem

在使用 xmpp 开发时,使用 Guzzle 库会遇到下面的错。 GuzzleHttp \ Exception \ RequestException cURL error 60: SSL certificate problem: unable to get local issuer certi...

chuangnuo1449的博客 252

PHP使用GuzzleHttp进行HTTP请求

2,设置过期时间和跳过ssl验证。3,post请求 :json。1,composer安装。3,delete请求。

zhouchang111的博客 3199

GuzzleHttp cURL error 60: SSL certificate problem: self signed certificate

报错问题 GuzzleHttp 发起https请求时,会报以下错误 cURL error 60: SSL certificate problem: self signed certificate 解决方案 guzzle 发起http请求与https请求的区别,发起https请求时,需要在构造函数中传入一个配置项, $client = new \GuzzleHttp\Client(['verify' =>false]); ...

WXiangQian 2887

curl: (60) SSL certificate problem: unable to get local issuer certificate 错误

curl: (60) SSL certificate problem: unable to get local issuer certificate 错误 SSL certificate problem: unable to get local issuer certificate。 的错误信息。 此问题的出现是由于没有配置信任的服务器HTTPS验证。默认,cURL被设为不信任任何CAs,就是说,它不信任任何服务器验证。 因此,这就是浏览器无法通过HTTPs访问你服务器的原因。 解决此报.

AI 前沿技术实战博客:LLM / Agent / AI 制药 / 生信四大栏目日更,硬核干货 + 可复现代码,看完就能上手 1万+

使用科大讯飞语音转写问题curl报错

配置php.ini 文件。

weixin_44874327的博客 437
上一篇: ES6中箭头函数和普通函数的区别
下一篇: ES6对象的合并
IMJCW
博客等级 码龄10年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值