PayPal IPN侦听器 - SSL证书握手失败

时间:2016-01-27 11:45:02

标签: php ssl curl paypal https

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

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

  

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

以下是我的代码(其中$fieldsPOST返回的正确字段):

$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并将其放在与我的脚本相同的目录中。这没有任何区别。

我的代码是否正确..?

如何使这项工作......?

1 个答案:

答案 0 :(得分:1)

我现在有这个工作,这里有:

  1. 验证证书
  2. 升级到至少PHP 5.6.0 / OpenSSL 1.0.1
  3. 保存并引用cacert.pem
  4. 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 。我认为至少需要OpenSSL 1.0.1才能支持PayPal所需的TLS 1.2。

    3。保存并引用cacert.pem

    http://curl.haxx.se/docs/caextract.html本地保存 cacert.pem (在我的情况下保存到c:\cert),然后更新您用来引用{{1}的PHP ini }} as shown here。使用ini文件可以避免在每次通话中使用cacert.pem