Ошибка скручивания 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», и, как правильно указал Мартин Холс, это опасно.

    Вероятно, эта ошибка вызвана отсутствием актуального пакета корневых сертификатов 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. Загрузка cacert.pem файла cacert.pem с веб-сайта cURL и
    2. Установка пути к нему в файле 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; 

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