Запуск 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
35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
35 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
4 OpenSSL was built without SSLv2 support
35 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
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 и помещается в тот же каталог, что и мой скрипт. Это не имеет никакого значения.
Правильно ли мой код..?
Как это сделать?..
У меня сейчас это работает, вот как:
cacert.pem
Используйте curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
для проверки сертификата.
Обновите, по крайней мере, до PHP 5.6.0, что, похоже, принесет с собой OpenSSL/1.0.1i. Я думаю, что для поддержки TLS 1.2 требуется PayPal, по крайней мере, для OpenSSL версии 1.0.1.
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');
в каждом вызове.