Curl 响应失败:mailwizz 上的“无法获取本地颁发者证书”

Posted

技术标签:

【中文标题】Curl 响应失败:mailwizz 上的“无法获取本地颁发者证书”【英文标题】:Curl failed with response: 'unable to get local issuer certificate' on mailwizz 【发布时间】:2017-03-04 00:38:15 【问题描述】:

我一直在尝试在 mailwizz 上为我的国家/地区的支付平台开发支付网关,并且一切正常......这一切都在工作,直到我尝试使用支付网关的类验证交易然后我得到了那个错误.. .here 我认为问题出在支付网关的类中

private function callViaCurl($interface, $payload = [ ], $sentargs = [ ])



    $endpoint = PaystackHelpersRouter::PAYSTACK_API_ROOT . $interface[PaystackContractsRouteInterface::ENDPOINT_KEY];
    $method = $interface[PaystackContractsRouteInterface::METHOD_KEY];

    $this->moveArgsToSentargs($interface, $payload, $sentargs);
    $this->putArgsIntoEndpoint($endpoint, $sentargs);

    $headers = ["Authorization"=>"Bearer " . $this->secret_key ];
    $body = '';
    if (($method === PaystackContractsRouteInterface::POST_METHOD)
        || ($method === PaystackContractsRouteInterface::PUT_METHOD)
    ) 
        $headers["Content-Type"] = "application/json";
        $body = json_encode($payload);
     elseif ($method === PaystackContractsRouteInterface::GET_METHOD) 
        $endpoint = $endpoint . '?' . http_build_query($payload);
    

    //open connection

    $ch = curl_init();
    // set url
    curl_setopt($ch, CURLOPT_URL, $endpoint);

    if ($method === PaystackContractsRouteInterface::POST_METHOD || $method === PaystackContractsRouteInterface::PUT_METHOD) 
        ($method === PaystackContractsRouteInterface:: POST_METHOD) && curl_setopt($ch, CURLOPT_POST, true);
        ($method === PaystackContractsRouteInterface ::PUT_METHOD) && curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");

        curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
    
    //flatten the headers
    $flattened_headers = [];
    while (list($key, $value) = each($headers)) 
        $flattened_headers[] = $key . ": " . $value;
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, $flattened_headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // Make sure CURL_SSLVERSION_TLSv1_2 is defined as 6
    // Curl must be able to use TLSv1.2 to connect
    // to Paystack servers

    if (!defined('CURL_SSLVERSION_TLSV1_2')) 
        define('CURL_SSLVERSION_TLSV1_2', 6);
    
    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSV1_2);

    $response = curl_exec($ch);

    if (curl_errno($ch))    // should be 0
        // curl ended with an error
        $cerr = curl_error($ch);
        curl_close($ch);
        throw new Exception("Curl failed with response: '" . $cerr . "'.");
    

    // Then, after your curl_exec call:
    $resp = json_decode($response);
    //close connection
    curl_close($ch);

    if (!$resp->status) 
        throw new Exception("Paystack Request failed with response: '" . $resp->message . "'.");
    

    return $resp;



【问题讨论】:

没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例 (***.com/help/mcve) curl: (60) SSL certificate : unable to get local issuer certificate的可能重复 【参考方案1】:

当 cURL 尝试建立加密连接但没有确定哪些证书可以信任所需的本地证书存储时,会发生这种情况。

有两种选择:

1添加一个设置,让 cURL 知道在哪里可以找到本地证书存储:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');

2 或者在php.ini 中设置CAINFO,这样所有cURL 操作都将使用同一个证书文件,而无需每次都设置该选项:

php.ini

[curl]
; A default value for CURLOPT_CAINFO option. Must be an absolute path.
curl.cainfo = "/path/to/cacert.pem"

我使用了this pem file,我相信它是 Firefox 内部证书存储的镜像。另见this answer

【讨论】:

非常感谢您的回复我试试看是否有效 我用它的证书尝试了我的一个域......但是有没有一种方法可以让它在没有 ssl 检查测试的情况下工作 @carrion 禁用 SSL 检查,执行curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

以上是关于Curl 响应失败:mailwizz 上的“无法获取本地颁发者证书”的主要内容,如果未能解决你的问题,请参考以下文章

如何解决`curl:(52)从localhost上的服务器响应的空回复?

PHP cURL 错误“安全库失败”。

localhost上的测试Laravel API无法获得响应

linux 安装curl失败

在 AFNetworking 2 的失败块中访问 JSON 响应

cURL Apple iCloud 日历订阅链接失败