Laravel5.8中Guzzle请求自签HTTPS接口遇cURL error 60错误
解决Laravel 5.8中Guzzle请求自签名HTTPS地址的SSL证书错误
我仔细看了你的代码,问题主要出在两个地方——Guzzle请求的参数传递错误,以及SSL验证选项的设置方式没生效,这才导致你明明加了关闭SSL验证的参数,却还是遇到证书错误。下面给你一步步修正:
1. 核心问题:Guzzle request 方法的参数传错了
你现在的写法是把headers和options作为两个单独的参数传给request方法,但Guzzle的request方法签名是:
public function request($method, $uri, array $options = [])
第三个参数是包含所有配置的单一数组,包括请求头、超时、SSL设置等,分开传的话,第二个数组(你的$options)根本不会被Guzzle识别,这就是你的SSL关闭设置完全没起作用的关键!
2. 修正后的正确代码
我推荐用Guzzle官方推荐的方式关闭SSL验证(比直接用curl常量更直观可靠),同时修复参数传递问题:
public static function get($url) { try { $client = new Client(); $options = [ 'http_errors' => true, 'connect_timeout' => 3.14, 'read_timeout' => 3.14, 'timeout' => 3.14, 'verify' => false, // 直接关闭SSL证书验证,Guzzle原生支持 'headers' => [ 'Keep-Alive' => 'timeout=300' ] ]; $result = $client->request('GET', $url, $options); return json_decode($result->getBody(), true); } catch (ConnectException $e) { // Logging::error($e); return null; } catch (\Exception $e) { // 建议加上通用异常捕获,避免遗漏其他错误 // Logging::error($e); return null; } }
3. 如果坚持要用curl选项的写法
如果你还是想用curl的常量来设置,也可以,但必须把curl数组放到$options的curl键下,并且确保整个配置数组作为第三个参数传递:
$options = [ 'http_errors' => true, 'connect_timeout' => 3.14, 'read_timeout' => 3.14, 'timeout' => 3.14, 'curl' => [ CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false ], 'headers' => [ 'Keep-Alive' => 'timeout=300' ] ]; $result = $client->request('GET', $url, $options);
最后提醒
关闭SSL验证只适合开发环境或者内网完全信任的服务,如果是生产环境,建议把自签名证书添加到服务器的信任列表中,然后将verify设置为证书文件的路径,这样既保证安全,又能避免证书错误。
内容的提问来源于stack exchange,提问作者code-8
相关产品推荐
相关产品推荐

