Ошибка Curl 60, проблема с сертификатом SSL: самозаверяющий сертификат в цепочке сертификатов
Я пытаюсь отправить запрос curl с моим правильным APP_ID, APP_SECRET и т. д. к
https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI
мне нужно получить access_token от него, но получить FALSE и curl_error()
печать следующего сообщения в противном случае:
60: SSL certificate problem: self signed certificate in certificate chain
мой код:
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $url);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
if ( ! $output) {
print curl_errno($ch) .': '. curl_error($ch);
}
// close curl resource to free up system resources
curl_close($ch);
return $output;
когда я перемещаюсь вручную по ссылке выше, я получаю access_token хорошо. Почему это не работает с curl? Помогите, пожалуйста.
6 ответов
принятый ответ не должен быть принят. Вопрос в том, "почему он не работает с cURL", и, как правильно указал Мартийн Хольс, это опасно.
ошибка, вероятно, вызвана отсутствием обновленного пакета корневых сертификатов CA. Обычно это текстовый файл с кучей криптографических подписей, которые curl использует для проверки SSL-сертификата хоста.
вам нужно убедиться, что ваша установка PHP имеет один из этих файлов, и что он обновлен (в противном случае загрузите его здесь:http://curl.haxx.se/docs/caextract.html).
затем установить в php.ini:
curl.cainfo = <absolute_path_to> cacert.pem
Если вы создаете его во время выполнения, используйте:
curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
этот способ опасно и не рекомендуется:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
не рекомендуется отключать одноранговую проверку SSL. Это может подвергнуть ваши запросы атакующим MITM.
на самом деле, вам просто нужен обновленный пакет корневых сертификатов CA. Установка обновленного так же просто, как:
- загрузки до-до-даты С веб-сайт cURL и
-
настройки путь к нему в PHP.ini-файл, например, в Windows:
curl.cainfo=c:\php\cacert.pem
вот именно!
оставайтесь в безопасности.
Так как протокол https, для режим разработки вы можете установить эту опцию curl, чтобы избежать ошибок проверки ssl в качестве быстрого решения.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
но для вашей рабочей среды не развертывайте это простое исправление. Это вызовет проблему безопасности, поскольку передача данных будет прозрачной между сетевыми слоями. См. раздел надлежащего исправления из следующего URL-адрес:
http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/
ЭЙ, РЕБЯТА: ОЧЕНЬ ВАЖНО! Эта проблема сводила меня с ума в течение нескольких дней, и я не мог понять, что происходит с моими установками curl & openssl. Наконец я понял, что это мой промежуточный сертификат (в моем случае, GoDaddy), который устарел. Я вернулся к своей панели администрирования SSL GoDaddy, загрузил новый промежуточный сертификат, и проблема исчезла.
Я уверен, что это вопрос для некоторых из вас.
по-видимому, GoDaddy изменился их промежуточный сертификат в какой-то момент из-за проблем с безопасностью, поскольку теперь они отображают это предупреждение:
" пожалуйста, не забудьте использовать новые промежуточные сертификаты SHA-2, включенные в загруженный пакет."
надеюсь, это поможет некоторым из вас, потому что я сходил с ума, и это очистило проблему на всех моих серверах...
если SSL-сертификатов не установлен в вашей системе, вы можете получить эту ошибку:
ошибка cURL 60: проблема с сертификатом SSL: невозможно получить локальный эмитент сертификат.
Вы можете решить эту проблему следующим образом:
загрузите файл с обновленным списком сертификатов из https://curl.haxx.se/ca/cacert.pem
переместить скачанный cacert.pem
файл в безопасное место в вашем система
обновить php.ini
file и настройте путь к этому файлу:
Не используйте этот метод в производство! Использовать только в целях разработки
Я нашел ответ, вам нужно отключить проверку SSL:
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $url);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// $output contains the output string
$output = curl_exec($ch);
if ( ! $output) {
print curl_errno($ch) .': '. curl_error($ch);
}
// close curl resource to free up system resources
curl_close($ch);
return $output;
и это хорошо работает! Спасибо всем :)