У меня есть сайт, который подключается с использованием cURL (последняя версия) к безопасному шлюзу для оплаты.
Проблема заключается в том, что cURL всегда возвращает 0 длины. Я получаю только заголовки. И только когда я устанавливаю cURL для возврата заголовков. У меня есть следующие флаги.
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_URL, $gatewayURI); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_POST, 1);
Возвращенный заголовок
HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Tue, 25 Nov 2008 01:08:34 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Content-Length: 0 Content-Type: text/html Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/ Cache-control: private
Я также пробовал cURL'ing на разных сайтах, и они отлично передают контент. Я думаю, что проблема может иметь какое-то отношение к соединению https.
Я разговаривал с компанией, и они бесполезны.
Кто-нибудь еще испытал эту ошибку и знает работу? Должен ли я fsockopen()
cURL и пытаться использовать fsockopen()
?
Спасибо. 🙂
Вы также должны попробовать проверить сообщения об ошибках в curl_error (). Возможно, вам понадобится сделать это один раз после каждой функции curl_ *.
Сегодня у меня была такая же проблема. Curl поставляется с устаревшим файлом для аутентификации сертификатов HTTPS.
получить новый от:
http://curl.haxx.se/ca/cacert.pem
сохраните его в каком-то каталоге на своем сайте
и добавить
curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
К каждой просьбе 🙂
IGNORE о любых комментариях об отключении CURLOPT_VERIFYPEER и CURLOPT_VERIFYHOST !! Это оставляет ваш код уязвимым для человека в средних атаках!
Декабрь 2016 изменить:
Решите это правильно, используя метод Jasen, упомянутый ниже.
Добавьте curl.cainfo=/etc/ssl/certs/ca-certificates.crt
к php.ini
Октябрь 2017 г. редактировать:
Теперь есть пакет композиторов, который помогает вам управлять сертификатами ca, чтобы вы не были уязвимы, если ваш cacert.pem устарел из-за отзыва сертификатов.
https://github.com/paragonie/certainty -> composer require paragonie/certainty:dev-master
Примечание. Это строго не производственное использование. Если вы хотите быстро отладить, это может быть полезно. В противном случае, пожалуйста, используйте ответ @ SchizoDuckie выше.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
Просто добавьте их. Оно работает.
У меня была очень похожая проблема и она была решена путем добавления
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
По-видимому, сайт, на который я перенаправляю перенаправления в другое место и php-curl, по умолчанию не следует перенаправлению.
У меня была ситуация, когда это помогло: (PHP 5.4.16 в Windows)
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
Всякий раз, когда я тестирую что-то с помощью PHP / Curl, я сначала пытаюсь использовать его из командной строки, выяснять, что работает, а затем переносить мои параметры на PHP.
Иногда вам необходимо обновить свои сертификаты Curl до последней версии, чтобы не иметь ошибок с https.
Я использовал file_get_contents
используя stream_create_context
и он отлично работает:
$postdataStr = http_build_query($postdataArr); $context_options = array ( 'http' => array ( <blink> // this will allways be http!!!</blink> 'method' => 'POST', 'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($postdataArr) . "\r\n" . "Cookie: " . $cookies."\r\n" 'content' => $postdataStr ) ); $context = stream_context_create($context_options); $HTTPSReq = file_get_contents('https://www.example.com/', false, $context);
может возникнуть проблема в вашей веб-хостинговой компании, где вы тестируете безопасную связь для шлюза, чтобы они не позволяли вам это делать.
также может быть имя пользователя, пароль, который должен быть предоставлен перед подключением к удаленному хосту.
или ваш IP, возможно, должен быть в списке одобренных IP-адресов для удаленного сервера для связи для инициирования.
Я обнаружил эту ошибку в недавнем проекте приложения. Я писал для запуска из командной строки или окна браузера, поэтому я использовал обнаружение сервера, чтобы получить относительный URL-адрес документа, который я просил. Проблема заключалась в том, что на сайте есть https, и каждый раз, когда я пытался получить доступ к http: // (тот же сервер), cURL помог изменить его на https.
Это отлично работает в браузере, но из командной строки я получаю ошибку SSL, даже если оба параметра проверки установлены на false. Я должен был сделать,
1) Проверьте $ _SERVER ['HTTP_HOST']. Если присутствует, используйте ($ _SERVER ['HTTPS']? "Https: //": "http: //"). $ _ SERVER ['HTTP_HOST']
2) Проверьте $ _SERVER ['COMPUTERNAME'], и если он соответствует производственному серверу, укажите URL-адрес https. (" https: // (имя сервера) ")
3) Если ни одно условие не прошло, это означает, что я запускаю командную строку на другом сервере и использую « http: // localhost ».
Теперь это сработало, но это взломать. Кроме того, я никогда не выяснял, почему на одном сервере (https) cURL изменил мой URL, а на другом (также https) он оставил мой URL один.
Weird.
Лучший способ использовать https и избежать проблем безопасности – использовать Firefox (или другой инструмент) и загрузить сертификат на ваш сервер. Эта страница помогла мне много , и это были шаги, которые работали на меня:
1) Откройте в Firefox URL, который вы собираетесь использовать с CURL
2) На адресной строке нажмите на padlock
> more information
(версии FF могут иметь разные меню, просто найдите их). Нажмите кнопку « Просмотреть сертификат» > вкладка « Details
».
3) Выделите «правильный» сертификат в Certificate hierarchy
. В моем случае это был второй из трех, называемый «сертификационный центр cPanel, Inc.». Я только что нашел правильный метод «проб и ошибок».
4) Нажмите кнопку « Экспорт» . В моем случае тот, кто работал, был типом файла «PEM с цепочками» (опять же методом проб и ошибок).
5) Затем в вашем скрипте PHP добавьте:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CAINFO, [PATH_TO_CRT_FILE]);
Кроме того, я бы сказал, что мы должны обратить внимание на то, что эти шаги, вероятно, нужно будет переделать один раз в год или всякий раз, когда сертификат URL будет заменен или обновлен.
Вы используете метод POST, но предоставляете ли вы массив данных? Например
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data);