Ошибка скручивания 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 хорошо. Почему это не работает с завитком? Помогите, пожалуйста.
Ответы
Ответ 1
Ответы, предлагающие отключить CURLOPT_SSL_VERIFYPEER
не принимаются. Вопрос в том, "почему он не работает с 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");
Ответ 2
Это обходное решение опасно и не рекомендуется:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Не рекомендуется отключать проверку равных прав SSL. Это может вызвать ваши запросы на злоумышленников MITM.
На самом деле вам просто нужен обновленный комплект корневых сертификатов CA. Установка обновленной версии проста:
Что это!
Будьте в безопасности и безопасны.
Ответ 3
Поскольку протокол 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/
Ответ 4
ГОВОРИТ: ОЧЕНЬ ВАЖНО! Этот вопрос заставил меня сходить с ума на пару дней, и я не мог понять, что происходит с моими локонами и установками openssl. Я, наконец, понял, что это мой сертификат INTERMEDIATE (в моем случае, GoDaddy), который устарел. Я вернулся на свою панель администрирования SSL-сообщества godaddy, загрузил новый промежуточный сертификат, и проблема исчезла.
Я уверен, что это проблема для некоторых из вас.
По-видимому, GoDaddy в какой-то момент изменил свой промежуточный сертификат из-за проблем с ограничениями, поскольку теперь они отображают это предупреждение:
"Пожалуйста, не забудьте использовать новые промежуточные сертификаты SHA-2, включенные в загруженный комплект".
Надеюсь, это поможет некоторым из вас, потому что я сходил с ума, и это очистило проблему на ВСЕХ моих серверах...
Ответ 5
Если SSL-сертификаты неправильно установлены в вашей системе, вы можете получить эту ошибку:
ошибка cURL 60: проблема сертификата SSL: не удается получить локальный эмитент сертификат.
Вы можете решить эту проблему следующим образом:
Загрузите файл с обновленным списком сертификатов из https://curl.haxx.se/ca/cacert.pem
Переместите загруженный файл cacert.pem
в безопасное место в вашей системе
Обновите файл php.ini
и настройте путь к этому файлу:
Ответ 6
Хорошая статья для этого вопроса - https://snippets.webaware.com.au/howto/stop-turning-off-curlopt_ssl_verifypeer-and-fix-your-php-config/
Ответ 7
Не используйте это обходное решение в производстве! Использовать только для целей разработки
Я нашел ответ, вам нужно отключить проверку 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;
и он работает хорошо! Спасибо всем:)