【问题标题】:cURL error 60 while using the GuzzleHttp使用 GuzzleHttp 时出现 cURL 错误 60
【发布时间】:2017-02-13 02:32:32
【问题描述】:

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

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

我的确切错误是:

在 C:\path\guzzle\src\Handler\CurlFactory 中未捕获异常 'GuzzleHttp\Exception\RequestException' 并带有消息 'cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书(请参阅 http://curl.haxx.se/libcurl/c/libcurl-errors.html)'。 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 第 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。这些选项需要在库中的某个地方设置。是否可以在我自己的文件中禁用验证而不是更改库的源代码?

【问题讨论】:

    标签: php ssl curl


    【解决方案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 的问题有关。不确定这是否适合您尝试。

    【讨论】:

    • 谢谢烧烤。 :) 我尝试通过在curl_reset($resource); 下方的其他选项下指定它来设置此选项,例如curl_setopt($resource, CURLOPT_SSL_VERIFYHOST, 0);,但错误并没有消失。
    • 我不知道 guzzle,但是 curl 的大多数证书问题都可以通过禁用主机验证或安装根证书包来解决。如果这些选项都没有帮助,那可能是一个特定的问题。 .
    • 感谢它帮助我解决问题的链接。 :)
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2020-11-15
    • 2017-12-28
    • 2018-03-23
    • 1970-01-01
    • 2016-10-26
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多