Я пытаюсь отправить запрос 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», и, как правильно указал Мартин Холс, это опасно.
Вероятно, эта ошибка вызвана отсутствием актуального пакета корневых сертификатов 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. Установка обновленной версии проста:
cacert.pem
файла cacert.pem
с веб-сайта cURL и Установка пути к нему в файле php.ini, например, в Windows:
curl.cainfo=c:\php\cacert.pem
Это оно!
Будьте в безопасности и в безопасности.
Поскольку протокол https, для режима разработки вы можете установить этот параметр завивки, чтобы избежать ошибок проверки 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. Я, наконец, понял, что это мой сертификат INTERMEDIATE (в моем случае, GoDaddy), который устарел. Я вернулся к своей панели администрирования SSL-сообщества godaddy, загрузил новый промежуточный сертификат, и проблема исчезла.
Я уверен, что это проблема для некоторых из вас.
По-видимому, GoDaddy в какой-то момент изменил свой промежуточный сертификат из-за проблем с уязвимостью, поскольку теперь они отображают это предупреждение:
«Обязательно используйте новые промежуточные сертификаты SHA-2, включенные в загруженный комплект».
Надеюсь, это поможет некоторым из вас, потому что я схожу с ума, и это очистило проблему на ВСЕХ моих серверах …
Если SSL-сертификаты не установлены должным образом в вашей системе, вы можете получить эту ошибку:
cURL error 60: проблема с сертификатом SSL: невозможно получить сертификат локального эмитента.
Вы можете решить эту проблему следующим образом:
Загрузите файл с обновленным списком сертификатов из https://curl.haxx.se/ca/cacert.pem
Переместите загруженный файл cacert.pem
в безопасное место в вашей системе
Обновите файл php.ini
и настройте путь к этому файлу:
Не используйте это обходное решение в производстве! Использовать только для целей разработки
Я нашел ответ, вам нужно отключить проверку 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;
и это хорошо работает! Спасибо всем 🙂