Необходимо также попытаться проверить сообщения об ошибках в curl_error (). Вы, возможно, должны были бы сделать это однажды после каждой функции curl_*.
Сегодня у меня была та же проблема. Завихрение идет с устаревшим файлом для аутентификации сертификатов HTTPS от.
получают новый от:
http://curl.haxx.se/ca/cacert.pem
сохраняет его в некоторый dir на Вашем сайте
и добавляет
curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
К каждому запросу:-)
, ИГНОРИРУЮТ любые тупые комментарии об отключении 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
Каждый раз, когда я тестирую что-то с PHP/Curl, я пробую его из командной строки сначала, выясняю, какие работы, и затем портируют мои опции на PHP.
могла бы быть проблема в Вашей хостинговой компании от того, где Вы тестируете безопасную коммуникацию на шлюз, что они не могли бы позволить Вам делать это.
также могло бы быть имя пользователя, пароль, который должен быть обеспечен прежде, чем соединиться с удаленным хостом.
или Ваш IP, возможно, должен был бы быть в списке утвержденного IP для удаленного сервера для коммуникации для инициирования.
Вы используете метод POST, но Вы обеспечиваете массив данных? Например,
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
Я использовал 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);
Я обнаружил эту ошибку в недавнем проекте приложения. Я писал для запуска из командной строки или окна браузера, поэтому я использовал обнаружение сервера, чтобы получить относительный URL-адрес документа, который я просил. Проблема заключалась в том, что сайт https, и каждый раз, когда я пытался получить доступ к http: // (тот же сервер), cURL любезно менял его на https.
Это нормально работает в браузере, но с в командной строке я бы получил ошибку SSL, даже если для обоих параметров verify установлено значение false. Мне нужно было
1) Проверить $ _SERVER ['HTTP_HOST']. Если присутствует, используйте ($ _SERVER ['HTTPS']? "Https: //": "http: //"). $ _ SERVER ['HTTP_HOST']
2) Проверьте $ _SERVER ['COMPUTERNAME'] и если он соответствует производственному серверу, укажите URL-адрес https. (" https:
Иногда, чтобы не допустить ошибок с https, необходимо обновить сертификаты Curl до последней версии.
Примечание: это строго не производственное использование. Если вы хотите быстро отладить, это может быть полезно. В противном случае используйте ответ @ SchizoDuckie выше.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
Просто добавьте их. Оно работает.