对Paypal沙箱的卷曲请求失败,
错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败
这个症状已经成为许多stackoverflow问题的主题 - 我已经在几个站点上解决了这个问题,但在这种情况下,我还没有将答案拉到一起来寻找可行的解决方案。
问题域是TLSv1.2的强制执行 - 它在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获取的卷曲名称。
我从哪里开始?
[编辑添加:]
我已尝试对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 - 这有点令人失望,因为我期待其中一个工作而不能在沙盒中使用。
答案 0 :(得分:0)
所以我的客户的托管支持终于被证实了:
我们目前托管该网站的GRID平台不包含TLS1.2的密码。
所以@hanshenrik是对的。我推断当你对tlstest.paypal.com进行测试时,如果TLS协议的正确版本不可用,则会失败。但是,成功并不表示所有元素都存在,以便成功正确调用Paypal沙箱 - 特别是在tlstest上未检查密码套件,即使在调用中添加了主体并指定了此选项:
curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
您必须指定单个密码才能获得tlstest以抛出握手错误。