2014-01-17 2 views
35

Я пытаюсь отправить запрос локон с моей правильной APP_ID, APP_SECRET и т.д. вCurl ошибка 60, выпуск сертификата SSL: самостоятельно подписанный сертификат в цепочке сертификатов

https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 

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

+0

Возможно, мне нужно получить сертификат с расширением '.crt'? Но я не знаю, как его получить –

+1

Пожалуйста, избегайте принятого ответа. Вместо этого используйте ответ @ erlangsec. Также см. [Самый опасный код в мире: проверка сертификатов SSL в несерверном программном обеспечении] (http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html). – jww

ответ

97

Принятый ответ не принимается. Вопрос: «Почему он не работает с cURL», и, как правильно указал Мартин Холс, это опасно.

Ошибка, вероятно, связана с отсутствием актуального пакета корневых сертификатов СА. Обычно это текстовый файл с кучей криптографических подписей, которые curl использует для проверки SSL-сертификата хоста.

Вы должны убедиться, что ваша установка PHP имеет один из этих файлов и что она актуальна (в противном случае скачайте ее здесь: http://curl.haxx.se/docs/caextract.html).

Тогда set in php.ini:

curl.cainfo = <absolute_path_to> cacert.pem 

Если вы устанавливаете его во время выполнения, используйте:

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 
+1

Спасибо, но я искал предложение для работы с внешним API. Поэтому предложение, предлагающее @SabujHassan, является работой, и, поскольку я понял, API, который я использовал, не предоставляет SSL. –

+5

Это должен быть принятый ответ! – plocks

+0

Работал как шарм! спасибо! – ViaSat

22

Поскольку протокол https, для режима разработки вы можете установить эту функцию завивки, чтобы избежать ошибок проверки ssl как быстрого решения.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

Но для вашей производственной среды не развертывайте это легко. Это вызовет проблему безопасности, поскольку передача данных будет прозрачной среди сетевых уровней. Смотрите раздел надлежащего исправления из следующей ссылке:

http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

+1

Я уже нашел себя, спасибо!) –

+15

Это не только предотвратит ошибки проверки SSL, но также не позволит проверить, действительно ли SSL-сертификат действителен, и поэтому не проверяйте, действительно ли вы подключаетесь к тому, с кем хотите подключиться. (в основном это отрицает большую безопасность SSL-соединения) –

+3

Вы не должны использовать '' curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); '' если вы находитесь в производственной среде – lukaserat

-6

Не следует использовать этот обходной путь в производстве! Использовать только для целей развития

я нашел ответ, вам необходимо отключить 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; 

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

+1

Это не безопасная практика, чтобы отключить проверку SSL-равными. –

2

ЭЙ РЕБЯТА: ОЧЕНЬ ВАЖНО! Этот вопрос заставлял меня сходить с ума на пару дней, и я не мог понять, что происходит с моими локонами & openssl. Я, наконец, понял, что это мой сертификат INTERMEDIATE (в моем случае, GoDaddy), который устарел. Я вернулся к своей панели администрирования SSL-сообщества godaddy, загрузил новый промежуточный сертификат, и проблема исчезла.

Я уверен, что это проблема для некоторых из вас.

Видимо, GoDaddy изменили свое промежуточный сертификат в какой-то момент из-за проблем scurity, так как они теперь отображают это предупреждение:

«Пожалуйста, убедитесь, чтобы использовать новые SHA-2 промежуточных сертификатов, включенных в загруженном пачке «.

Надеется, что это помогает некоторым из вас, потому что я схожу с умом, и это вымыло вопрос на все мои серверах ...

+0

Хотя это точно не связано с вопросом, оно может представлять жизнеспособную информацию в целом. – nop77svk

+0

Ошибки сообщений curl иногда могут быть загадочными и вводящими в заблуждение, и я уверен, что некоторые люди, которые получали ошибку «самозаверяющего сертификата», получали его из-за причуды, которую я цитировал. Я также хотел добавить, что при построении curl я использовал строку configure: ./configure --with-ca-bundle =/etc/ssl/certs/ca-bundle.crt, и я также использовал скрипт perl lib/mk -ca-bundle.pl, чтобы создать хороший свежий файл ca-bundle.crt. Я использовал веб-сервер Apache, но я не заменил существующий промежуточный сертификат обновленным godaddy. – Lee

29

Это временное решение опасно и не рекомендуется:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

Не рекомендуется отключать проверку равных прав SSL. Это может вызвать ваши запросы на злоумышленников MITM.

На самом деле вам просто нужен современный комплект корневых сертификатов CA. Установка обновленной один так же легко, как:

  1. Загрузка уточненный cacert.pem файл из cURL website и
  2. Установка путь к нему в файле php.ini, например, на Windows:

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

Вот оно!

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

+5

Вы также можете установить этот параметр в своем коде, если у вас нет прав на редактирование глобального файла 'php.ini': ' curl_setopt ($ curl_ch, CURLOPT_CAINFO, dirname (__ FILE __). "/ Cacert.pem"); ' – zxcmehran

+0

Работает на среде dev – cmedeiros

+0

Хорошо для тестирования на dev env –

0

Если SSL сертификаты не правильно установлены в вашей системе, вы можете получить эту ошибку:

cURL error 60: SSL certificate problem: unable to get local issuer certificate.

Вы можете решить эту проблему следующим образом:

Скачать файл с обновленным списком сертификатов от https://curl.haxx.se/ca/cacert.pem

Переместить загруженный cacert.pem файл в безопасном месте в системе

Обновите файл php.ini и настройте путь к этому файлу:

Смежные вопросы