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

  1. загрузки до-до-даты С веб-сайт cURL и
  2. настройки путь к нему в 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;

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