Подтвердить что ты не робот

Ошибка скручивания 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 хорошо. Почему это не работает с завитком? Помогите, пожалуйста.

4b9b3361

Ответ 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. Установка обновленной версии проста:

  • Загрузка обновленного cacert.pem файла из сайта cURL и
  • Установка пути к нему в файле php.ini, например. в Windows:

    curl.cainfo=c:\php\cacert.pem

Что это!

Будьте в безопасности и безопасны.

Ответ 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 и настройте путь к этому файлу:

Ответ 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;

и он работает хорошо! Спасибо всем:)