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


PayPal IPN Listener - SSL Certificate Handshake Failure

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

我正在使用他们的沙盒环境为即时付款通知创建一个 IPN 侦听器PayPal但无论我做什么,我都收到 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服务器需要TLS 1.2并且不支持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. 验证证书
  2. 至少升级到 PHP 5.6.0/OpenSSL 1.0.1
  3. 保存和引用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。我认为至少需要OpenSSL版本1.0.1来支持TLS 1.2,这是PayPal需要的。

3. 保存和引用cacert.pem

cacert.pem 从本地 http://curl.haxx.se/docs/caextract.html 保存(在我的情况下保存到 c:'cert ),然后更新您用来引用cacert.pem的 PHP ini,如下所示。使用 ini 文件可以节省您在每次调用中使用curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . ''cacert.pem');