Прослушиватель IPP PayPal - сбой рукопожатия сертификата SSL

1

Запуск PHP 5.3.28 и curl 7.30.0 (OpenSSL/0.9.8y и libssh2/1.4.2) на Windows Server 2008 R2 с использованием IIS.

Я создаю прослушиватель 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');

Где cacert.pem загружается с http://curl.haxx.se/docs/caextract.html и помещается в тот же каталог, что и мой скрипт. Это не имеет никакого значения.

Правильно ли мой код..?

Как это сделать?..

Теги:
curl
ssl
https
paypal

1 ответ

1
Лучший ответ

У меня сейчас это работает, вот как:

  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. Я думаю, что для поддержки TLS 1.2 требуется PayPal, по крайней мере, для OpenSSL версии 1.0.1.

3. Сохранить и указать cacert.pem

Сохраните cacert.pem из http://curl.haxx.se/docs/caextract.html локально (в моем случае c:\cert), а затем обновите PHP ini, который вы используете для ссылки cacert.pem как показано здесь., Использование ini файла позволяет вам использовать curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__). '\cacert.pem'); в каждом вызове.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню