将SSL cURL请求从SSLv3更新为TLS ..?

时间:2014-11-05 17:46:26

标签: php ssl curl paypal

由于recent vulnerability discovered in SSLv3,许多网络服务提供商(即PayPal,Facebook,Google)正在禁用该功能,并希望我们使用TLS。我在弄清楚如何做到这一点时遇到了一些麻烦。

我目前正在使用以下函数来处理我的cURL请求。

function CURLRequest($Request = "", $APIName = "", $APIOperation = "", $PrintHeaders = false)
{
    $curl = curl_init();
            curl_setopt($curl, CURLOPT_VERBOSE, 1);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_TIMEOUT, 30);
            curl_setopt($curl, CURLOPT_URL, $this->EndPointURL);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $Request);

    if($this->APIMode == 'Certificate')
    {
        curl_setopt($curl, CURLOPT_SSLCERT, $this->PathToCertKeyPEM);
    }

    $Response = curl_exec($curl);

    /*
     * If a cURL error occurs, output it for review.
     */
    if($this->Sandbox)
    {
        if(curl_error($curl))
        {
            echo curl_error($curl).'<br /><br />';  
        }
    }

    curl_close($curl);
    return $Response;   
}

当我尝试点击PayPal的沙箱时,他们已经禁用了这个沙箱,我最终得到了一个cURL错误:错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败

我发现的信息是我只需要将其更改为使用TLS而不是SSL,而我见过的其他答案只是通过在我的函数中添加curl选项来做到这一点...... / p>

curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

我已添加该选项,但我仍然得到完全相同的结果。任何有关如何使这项工作的信息将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:3)

复制自:SSL error can not change to TLS

尝试在代码中添加curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');

如果你的cURL是基于OpenSSL libssl 而不是基于 nss ,那么这将有效。

答案 1 :(得分:3)

在Paypal更新其核心SDK之前,更好的解决方案是直接在应用程序中覆盖CURLOPT_SSL_CIPHER_LIST。这样您就不必直接干扰sdk-core-php软件包,将来可以自由升级。

您可以在应用的引导程序或付款处理逻辑中添加以下内容:

PPHttpConfig::$DEFAULT_CURL_OPTS[CURLOPT_SSL_CIPHER_LIST] = 'TLSv1';

请确保对其进行全面评论,并记得稍后在核心问题修补后将其删除。

答案 2 :(得分:0)

我刚解决了通过终端更新nss库的问题。

答案 3 :(得分:0)

如果上述方法无效,请检查OPENSSL版本。可能是因为OPENSSL版本<= 0.9.8。更新到PHP7会有所帮助,它带有更高版本的OPENSSL。