使用GuzzleHttp时出现cURL错误60

时间:2016-10-04 19:43:43

标签: php ssl curl

我想摆脱这个错误。我读了一个similar question,其中一个答案建议我可以使用以下方法禁用验证:

$client->setDefaultOption('verify', false);

我的确切错误是:

  

未捕获的异常'GuzzleHttp \ Exception \ RequestException',消息'cURL错误60:SSL证书问题:无法在C:\ path \ guzzle \ src \ Handler \中获取本地颁发者证书(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html)' CurlFactory.php:187堆栈跟踪:#0 C:\ path \ guzzle \ src \ Handler \ CurlFactory.php(150):GuzzleHttp \ Handler \ CurlFactory :: createRejection(Object(GuzzleHttp \ Handler \ EasyHandle),Array)#1

     

C:\ path \ guzzle \ src \ Handler \ CurlFactory.php(103):GuzzleHttp \ Handler \ CurlFactory :: finishError(Object(GuzzleHttp \ Handler \ CurlHandler),Object(GuzzleHttp \ Handler \ EasyHandle),Object( GuzzleHttp \ Handler \ CurlFactory))#2

     

C:\ path \ guzzle \ src \ Handler \ CurlHandler.php(43):GuzzleHttp \ Handler \ CurlFactory :: finish(Object(GuzzleHttp \ Handler \ CurlHandler),Object(GuzzleHttp \ Handler \ EasyHandle),Object( GuzzleHttp \ Hand in C:\ path \ guzzle \ src \ Handler \ CurlFactory.php on the line 187

我阅读了所有这些行的代码,并且没有像$client这样的变量,但我在CurlFactory.php中找到了这个函数。请注意,文件CurlFactory.php不是由我创建的。

public function release(EasyHandle $easy)
{
    $resource = $easy->handle;
    unset($easy->handle);

    if (count($this->handles) >= $this->maxHandles) {
        curl_close($resource);
    } else {
        // Remove all callback functions as they can hold onto references
        // and are not cleaned up by curl_reset. Using curl_setopt_array
        // does not work for some reason, so removing each one
        // individually.
        curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);
        curl_setopt($resource, CURLOPT_READFUNCTION, null);
        curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);
        curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);
        curl_reset($resource);
        $this->handles[] = $resource;
    }
}

我可以在此处设置禁用验证的选项吗?

我知道禁用验证不是一个好主意,但代码是供个人使用和测试的。如果禁用验证,则没有问题。这是我实际PHP文件中的代码。

require('vendor/autoload.php');
use JonathanTorres\MediumSdk\Medium;

$medium = new Medium('my-key');

$user = $medium->getAuthenticatedUser();
echo 'Authenticated user name is: ' . $user->name;

正如您所看到的,我在任何地方的代码中都没有使用cURL。需要在某个库中设置选项。是否可以在我自己的文件中禁用验证而不是更改库的源代码?

1 个答案:

答案 0 :(得分:1)

您可能正在寻找CURLOPT_SSL_VERIFYHOST选项。如果未指定,则此设置默认为选项2,这意味着如果证书名称与连接的服务器名称不匹配,连接将失败。将此值设置为0表示将忽略主机名,并且无论名称不匹配,都将接受证书。 通常这足以解决自签名证书的问题。

选项1是一个遗留选项,以前用于调试但不推荐使用,不应使用。

这也可能是由于curl无法找到根证书捆绑包。您可以download the bundle from the curl site并将其保存到服务器上的某个位置,然后在php.ini中添加对它的引用,如下所示: curl.cainfo = FOLDER_PATH \ cacert.pem

它也可能与Guzzle的版本有关,我发现这是Guzzle versions later than 4的问题。不确定这是否适合您尝试。