Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 贝宝沙盒SSL握手错误_Php_Ssl_Curl_Paypal_Tls1.2 - Fatal编程技术网

Php 贝宝沙盒SSL握手错误

Php 贝宝沙盒SSL握手错误,php,ssl,curl,paypal,tls1.2,Php,Ssl,Curl,Paypal,Tls1.2,对Paypal sandbox的Curl请求失败,原因是 错误:14077410:SSL例程:SSL23\u GET\u SERVER\u HELLO:sslv3警报握手失败 这种症状已经成为许多stackoverflow问题的主题——我已经在几个网站上解决了它,但在这种情况下,我还没有找到有效的解决方案 问题领域是TLSv1.2的实施,它在Paypal沙箱中很活跃,很快就会上线 此错误通常在以下情况下发生: TLSv1.2不可用,因为站点上的curl/openssl版本试图 打电话给贝宝,或

对Paypal sandbox的Curl请求失败,原因是

错误:14077410:SSL例程:SSL23\u GET\u SERVER\u HELLO:sslv3警报握手失败

这种症状已经成为许多stackoverflow问题的主题——我已经在几个网站上解决了它,但在这种情况下,我还没有找到有效的解决方案

问题领域是TLSv1.2的实施,它在Paypal沙箱中很活跃,很快就会上线

此错误通常在以下情况下发生:

  • TLSv1.2不可用,因为站点上的curl/openssl版本试图 打电话给贝宝,或者
  • 它没有在对贝宝的curl调用中使用,因此必须在curl选项中强制使用
但是,这可以通过对tlstest.paypal.com的curl调用进行检查,在本例中,调用return

PayPal\u连接\u正常

有无

curl_setopt($curl, CURLOPT_SSLVERSION, 6);
表示TLSv1.2不仅可用,而且默认使用。由于该站点报告的curl/openssl版本中不存在这种情况,因此我推断安全更新已经进行了后端口

插入调试信息已确认两个调用(url除外)之间的唯一区别是这些选项值

     "CURLOPT_POST":true,
     "CURLOPT_POSTFIELDS":"USER=uuuuuu&PWD=pppppp&SIGNATURE=ssssss&VERSION=204&METHOD=GetBalance&RETURNALLCURRENCIES=1",
我的推断是,握手问题在于数据的加密,因此我一直在考虑设置CURLOPT_SSL_CIPHER_LIST。一个建议是

curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
在这种情况下,它不会改变握手错误

我还研究了设置特定密码,但没有发现任何不会导致错误的值

设置密码列表失败

我尝试在调用站点上获取密码列表,使用openssl_get_cipher_methods(),它提供

'AES-128-CBC','AES-128-CFB','AES-128-CFB1','AES-128-CFB8','AES-128-OFB','AES-192-CBC','AES-192-CFB','AES-192-CFB1','AES-192-CFB8','AES-192-OFB','AES-256-CBC','AES-256-CFB','AES-256-CFB1','AES-256-CFB8','AES-256-OFB','BF-CBC','BF-CFB','BF-OFB','CAST5-CBC','CAST5-CFB','CAST5-OFB'
但这些都与我找到的openssl名称不匹配,我将使用这些名称映射到通过RFC名称获取的curl名称

我该怎么办

[编辑以添加:]

  • 操作系统Linux 2.6.26-2-amd64
  • PHP5.3.19-1~dotdeb.0(Zend:2.3.0)[我被告知这是可用的最高版本,没有解释]
  • OpenSSL 0.9.8o 2010年6月1日
  • curl版本7.21.0
我尝试了针对tlstest.paypal.com的进一步测试,通过添加选项值向curl请求添加一个主体:

  "CURLOPT_POST":true,
  "CURLOPT_POSTFIELDS":"A=B&C=D",
令人惊讶的是,它仍然返回一个成功的响应

因此,我现在比较了使用的两台服务器,可用的密码套件不同,服务器的首选顺序也不同。在tlstest上,有更多的安全密码可用,它们是首选密码,而在沙箱上,弱密码优先

因此,我仍然认为解决方案可能是指定一个密码列表,并且已经浏览了最新的ssltest信息,希望找到哪个在tlstest.paypal.com上有效。鉴于此,我现在尝试了各种方法(并了解到此选项的格式取决于openssl的构建方式),但我已经测试了测试报告的所有TLSv1.2密码套件,结果表明:

//  $cipher = 'AES128-SHA'; //handshake error
//  $cipher = 'AES256-SHA'; //handshake error
//  $cipher = 'ECDHE-RSA-AES128-SHA'; //handshake error
//  $cipher = 'ECDHE-RSA-AES256-SHA'; //handshake error
//  $cipher = 'AES128-SHA256'; //failed setting cipher list
//  $cipher = 'AES256-SHA256'; //failed setting cipher list
//  $cipher = 'AES128-GCM-SHA256'; //failed setting cipher list
//  $cipher = 'AES256-GCM-SHA384'; //failed setting cipher list
//  $cipher = 'ECDHE-RSA-AES128-SHA256'; //failed setting cipher list
//  $cipher = 'ECDHE-RSA-AES256-SHA384'; //failed setting cipher list
//  $cipher = 'ECDHE-RSA-AES128-GCM-SHA256'; //failed setting cipher list
    $cipher = 'ECDHE-RSA-AES256-GCM-SHA384'; //failed setting cipher list
    curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, $cipher);

来自tlstest.paypal.com-这有点令人失望,因为我希望其中一个可以正常工作,但无法在沙箱中使用。

因此,我客户的主机支持最终失败:

我们的网格平台目前承载着该站点的数据,不包括TLS1.2的密码

所以@hanshenrik是正确的。我推断,当您针对tlstest.paypal.com进行测试时,如果TLS协议的正确版本不可用,那么测试将失败。但是,success并不表示成功正确调用Paypal sandbox的所有元素都已存在,特别是没有在tlstest上检查密码套件,即使在调用中添加了正文并指定了此选项:

curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');

您必须指定单独的密码才能让tlstest抛出握手错误。

我已经多次看到类似的错误,而且几乎都是相同的(尽管我记得有些情况下它是一个不稳定的连接),更新到较新的ssl lib/curl lib会修复它。即使您的版本中存在tls 1.2功能,实现中也可能存在缺陷,由于某些原因,当您没有向请求添加正文时(正如CURLOPT_POSTFIELDS所做的那样),该缺陷不会显示出来。解决方案是修复ssl库,因为它有漏洞。更新到一个没有那么多错误的版本。你使用的是什么操作系统,OpenSSL和cURL的版本是什么?