Paypal Sandbox SSL握手错误

时间:2018-03-04 12:34:13

标签: php ssl curl paypal tls1.2

对Paypal沙箱的卷曲请求失败,

  

错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败

这个症状已经成为许多stackoverflow问题的主题 - 我已经在几个站点上解决了这个问题,但在这种情况下,我还没有将答案拉到一起来寻找可行的解决方案。

问题域是TLSv1.2的强制执行 - 它在Paypal沙箱中处于活动状态,并且即将投入使用。

时通常会发生此错误
  • 由于网站尝试使用curl / openssl版本,TLSv1.2不可用 致电Paypal,或
  • 它没有被用于Paypal的卷曲调用,所以必须强制使用卷曲选项

但是,这可以通过curl调用tlstest.paypal.com来检查,在这种情况下调用return

  

PayPal_Connection_OK

没有和有

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'

但这些都与我在https://www.openssl.org/docs/manmaster/man1/ciphers.html上找到的openssl名称相匹配,我将使用这些名称来映射通过RFC名称从https://github.com/curl/curl/blob/master/lib/vtls/nss.c获取的卷曲名称。

我从哪里开始?

[编辑添加:]

  • OS Linux 2.6.26-2-amd64
  • PHP 5.3.19-1~dotdeb.0(Zend:2.3.0)[我被告知,没有解释,这是最高的]
  • OpenSSL 0.9.8o 2010年6月1日
  • 卷曲版本7.21.0

我已尝试对tlstest.paypal.com进行进一步测试,通过添加选项值为curl请求添加正文:

  "CURLOPT_POST":true,
  "CURLOPT_POSTFIELDS":"A=B&C=D",

令人惊讶的是,它仍然会成功回复。

所以我现在使用https://www.ssllabs.com/ssltest/对两台服务器进行了比较,可用的密码套件不同,服务器和服务器也是如此。首选订单。在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 - 这有点令人失望,因为我期待其中一个工作而不能在沙盒中使用。

1 个答案:

答案 0 :(得分:0)

所以我的客户的托管支持终于被证实了:

  

我们目前托管该网站的GRID平台不包含TLS1.2的密码。

所以@hanshenrik是对的。我推断当你对tlstest.paypal.com进行测试时,如果TLS协议的正确版本不可用,则会失败。但是,成功并不表示所有元素都存在,以便成功正确调用Paypal沙箱 - 特别是在tlstest上未检查密码套件,即使在调用中添加了主体并指定了此选项:

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

您必须指定单个密码才能获得tlstest以抛出握手错误。