Intereting Posts
Как решить маршрут, не определенный в laravel 5.3? php pdo получает только одно значение из mysql; значение, равное переменной Как расширить параметры URL-адреса в KohanaPHP? CodeIgniter: как «выделить» ссылку на страницу, на которой пользователь в данный момент включен? Выберите алгоритм изменения размера изображения PHP Как сделать fputcsv «эхо» данными Загрузка файла YII без добавления в базу данных с использованием формы Получить частичную веб-страницу Есть ли ограничение по размеру для публикации файла с помощью curl? Как разобрать этот json с php Неустранимая ошибка: максимальное время выполнения 30 секунд превышено, когда я выполняю ежедневный запуск с моего сайта Загружайте большие файлы в Amazon S3 напрямую и добавляйте другую дату в базу данных с помощью веб-форм и PHP Примечание. Неопределенная переменная: captcha в C: \ wamp \ projects \ ServiceAdmin \ login \ loginauth.php в строке 11 Как отформатировать число до суммы в долларах в PHP Каков наилучший способ хранения даты и времени в MySQL?

Не удается подключиться к сайту HTTPS с помощью cURL. Вместо этого возвращает 0 длину. Что я могу сделать?

У меня есть сайт, который подключается с использованием 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() ?

Спасибо. 🙂

Solutions Collecting From Web of "Не удается подключиться к сайту HTTPS с помощью cURL. Вместо этого возвращает 0 длину. Что я могу сделать?"

Вы также должны попробовать проверить сообщения об ошибках в curl_error (). Возможно, вам понадобится сделать это один раз после каждой функции curl_ *.

http://www.php.net/curl_error

Сегодня у меня была такая же проблема. 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);