使用IIS在Windows Server 2008 R2上运行PHP 5.3.28和curl 7.30.0(OpenSSL / 0.9.8y&libssh2 / 1.4.2)。

我正在使用他们的沙盒环境为PayPal即时付款通知创建IPN侦听器,但是无论如何我都会收到SSL证书错误,例如:


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


这是我的代码(其中$fields是返回POST的正确字段):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.sandbox.paypal.com/cgi-bin/webscr';
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
if ($result = curl_exec($ch)) {
    echo 'result = '.$result.'<br>';
} else {
    echo 'result = '.$result.'<br>';
    echo 'errno = '.curl_errno($ch).'<br>';
    echo 'error = '.curl_error($ch).'<br>';
}
curl_close($ch);


因此,我了解到PayPal服务器requires TLS 1.2 and does not support SSL 2/3,但似乎无法使我的POST请求正常工作。我试过了:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

...我得到同样的错误。我也尝试过:

curl_setopt($ch, CURLOPT_SSLVERSION, n);

...得到以下结果:


[默认] = 35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
0 CURL_SSLVERSION_DEFAULT = 35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
1个CURL_SSLVERSION_TLSv1 = 35 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
2 CURL_SSLVERSION_SSLv2 = 4 OpenSSL was built without SSLv2 support
3 CURL_SSLVERSION_SSLv3 = 35 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
4 CURL_SSLVERSION_TLSv1_0 = 35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
5 CURL_SSLVERSION_TLSv1_1 = 35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
6 CURL_SSLVERSION_TLSv1_2 = 35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure


我也在某处阅读以尝试此操作:

curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '\cacert.pem');

http://curl.haxx.se/docs/caextract.html下载cacert.pem并将其放置在与脚本相同的目录中。这没有任何区别。

我的代码正确吗?

我如何做这项工作..?

最佳答案

我现在正在工作,方法如下:


验证证书
至少升级到PHP 5.6.0 / OpenSSL 1.0.1
保存并引用cacert.pem


1.验证证书

使用curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);验证证书。

2.至少升级到PHP 5.6.0 / OpenSSL 1.0.1

至少升级到PHP 5.6.0,它似乎随附了OpenSSL / 1.0.1i。我认为至少要支持PayPal要求的TLS 1.2,才需要OpenSSL版本1.0.1。

3.保存并引用cacert.pem

将cacert.pem从http://curl.haxx.se/docs/caextract.html本地保存(在我的情况下为c:\cert),然后更新用于引用cacert.pem as shown here的PHP ini。使用ini文件,您无需在每次调用中都使用curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '\cacert.pem');

关于php - Paypal IPN监听器-SSL证书握手失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35036468/

10-11 03:15