CURL error 60: Certificado SSL prblm: não é possível obter o certificado do emissor local

Eu quero coletar uma lista de vídeos carregados em um canal específico usando a API de dados do YouTube. No entanto, antes de implementar on-line, estou tentando colocar meu código em execução em um ambiente offline (WAMPserver, PHP 5.5.12, Apache 2.4.9). Estou usando o seguinte código:

require_once 'google-api-php-client-2.0.0-RC5/vendor/autoload.php'; $client = new Google_Client(); $client->setApplicationName("SRC_Thor"); $client->setDeveloperKey("xxxxxxxxxxx"); $youtube = new Google_Service_YouTube($client); $channelResponse = $youtube->channels->listChannels('contentDetails', []); var_dump($channelResponse); 

No entanto, ele dá o seguinte erro:

Erro fatal: exceção não detectada ‘GuzzleHttp \ Exception \ RequestException’ com mensagem ‘erro cURL 60: problema do certificado SSL: não é possível obter o certificado do emissor local (consulte http://curl.haxx.se/libcurl/c/libcurl-errors.html ) ‘

Eu tentei adicionar a versão mais recente do cacert.pem como a maioria dos tópicos sobre oferta SO como uma solução, porém sem sucesso.

Se você estiver no Windows xampp. Eu estou roubando uma resposta melhor a partir daqui , seria útil se o Google mostrar esta questão em 1º.

  1. Baixe e extraie para cacert.pem aqui (um formato de arquivo limpo / dados)

    https://gist.github.com/VersatilityWerks/5719158/download

  2. coloque dentro :

    C: \ xampp \ php \ extras \ ssl \ cacert.pem

  3. Adicione esta linha ao seu php.ini

    curl.cainfo = “C: \ xampp \ php \ extras \ ssl \ cacert.pem”

  4. reinicie seu servidor web / apache

Visto que estou usando um ambiente local, posso desabilitar com segurança o SSL, o que eu fiz usando o seguinte:

 $guzzleClient = new \GuzzleHttp\Client(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), )); $client->setHttpClient($guzzleClient); 

Onde $client customer é meu Google_Client ().

 $guzzleClient = new \GuzzleHttp\Client(['verify' => false]); 

Guzzle versão 6

Você pode se referir a Guzzle Docs em

http://docs.guzzlephp.org/en/latest/request-options.html#verify

O PCI-DSS 3.1 exige que todos os SSL sejam apenas TLS 1.2, de modo que muitos provedores estão simplesmente transformando tudo, mas o TLS 1.2. Eu encontrei esse tipo de problema em que a CURL viu a falha no downgrade handshakes como uma falha ao verificar o certificado SSL. Tente descobrir onde o seu código está fazendo a chamada CURL e adicione esta linha (certifique-se de replace $ch com o que o CURL lida com o seu código)

 curl_setopt($ch, CURLOPT_SSLVERSION, 6); // Force TLS 1.2 

para a essência do desenvolvimento e testes, você tem duas opções para uma solução rápida

  1. Usar
 $client = new GuzzleHttp\Client(); $request = $client->request('GET',$url, ['verify' => false]); //where $url is your http address 
  1. siga @Pham Huy Anh resposta acima, então faça isso
 $client = new GuzzleHttp\Client(); $request = $client->request('GET',$url, ['verify' => 'C:\xampp\php\extras\ssl\cacert.pem']); 

Espero que ajude alguém.

Também funcionou para mim, baixando o cert do link https://gist.github.com/VersatilityWerks/5719158/download, depois salve-o em C: \ xampp \ php \ extras \ ssl e edite php.ini. Para obter o Php.ini rapidamente, veja a figura abaixo, insira a descrição da imagem aqui

Então STOP e reinicie seu apache novamente. funcionou bem !!!

eu trabalho com xamp nada do acima funcionou para mim
Eu tentei isso e funcionou com o fornecedor aberto \ guzzlehttp \ guzzle \ src \ Handler \ CurlFactory.php

e mude thsi

  $conf[CURLOPT_SSL_VERIFYHOST] = 2; $conf[CURLOPT_SSL_VERIFYPEER] = true; 

para isso

  $conf[CURLOPT_SSL_VERIFYHOST] = 0; $conf[CURLOPT_SSL_VERIFYPEER] = FALSE; 

é uma solução temporária se você atualizou este arquivo, as mudanças serão perdidas

 $guzzleClient = new \GuzzleHttp\Client(['verify' => false]);