Uso o WAMP em um ambiente de desenvolvimento local e estou tentando cobrar um cartão de crédito, mas recebo a mensagem de erro:
cURL error 60: Problema no certificado SSL: não é possível obter o certificado do emissor local
Pesquisei bastante no Google e muitas pessoas estão sugerindo que eu baixe este arquivo: cacert.pem , coloque-o em algum lugar e faça referência a ele no meu php.ini. Esta é a parte do meu php.ini:
curl.cainfo = "C:\Windows\cacert.pem"
No entanto, mesmo depois de reiniciar o servidor várias vezes e alterar o caminho, recebo a mesma mensagem de erro.
Eu uso o WAMP dos módulos Apache e tenho o ssl_module ativado. E a partir das extensões PGP, tenho o php_curl ativado.
Ainda a mesma mensagem de erro. Por que isso está acontecendo?
Agora estou seguindo esta correção: Como corrigir PHP CURL Error 60 SSL
O que sugere que eu adicione essas linhas às minhas opções de cURL:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
Onde adiciono opções ao meu cURL? Aparentemente, não através da linha de comando, pois minha CLI não encontra o comando "curl_setopt"
EDITAR
Este é o código que estou executando:
public function chargeStripe()
{
$stripe = new Stripe;
$stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));
$charge = $stripe->charges()->create([
'amount' => 2900,
'customer' => Input::get('stripeEmail'),
'currency' => 'EUR',
]);
dd($charge);
// echo $charge[Input::get('stripeToken')];
return Redirect::route('step1');
}
Respostas:
Solução de trabalho assumindo que você esteja no Windows usando XAMPP:
Reinicie seu servidor web / apache
Problema resolvido!
(Referência: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )
fonte
curl.cainfo = "C:/cacert.pem"
e também tive que reiniciar meu computador para fazê-lo funcionar. Apenas reiniciar o servidor web não foi suficiente. Espero que ajude:]curl.cainfo
(facepalm)Atenção usuários do Wamp / Wordpress / windows. Eu tive esse problema por horas e nem a resposta correta estava fazendo isso por mim, porque eu estava editando o arquivo php.ini errado porque a pergunta foi respondida ao XAMPP e não para usuários do WAMP, mesmo que a pergunta fosse para o WAMP.
aqui está o que eu fiz
Faça o download do pacote de certificados.
Coloque dentro de
C:\wamp64\bin\php\your php version\extras\ssl
Verifique se o arquivo
mod_ssl.so
está dentro deC:\wamp64\bin\apache\apache(version)\modules
Ativar
mod_ssl
nohttpd.conf
interior de diretório ApacheC:\wamp64\bin\apache\apache2.4.27\conf
Ativar
php_openssl.dll
nophp.ini
. Esteja ciente de que meu problema era que eu tinha dois arquivos php.ini e preciso fazer isso nos dois. O primeiro pode ser localizado dentro do seu ícone da barra de tarefas WAMP aqui.e o outro está localizado em
C:\wamp64\bin\php\php(Version)
encontre o local para os dois
php.ini
arquivos, encontre a linhacurl.cainfo =
e indique um caminho como estecurl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"
Agora salve os arquivos e reinicie o servidor e você deve estar pronto
fonte
Se você estiver usando o PHP 5.6 com o Guzzle, o Guzzle passou a usar as bibliotecas PHP de detecção automática de certificados em vez de seu processo ( ref ). O PHP descreve as mudanças aqui .
Descobrindo onde o PHP / Guzzle está procurando por certificados
Você pode despejar a localização do PHP usando:
Obtendo um pacote de certificados
Para teste do OS X, você pode usar o homebrew para instalar o openssl
brew install openssl
e, em seguida, usaropenssl.cafile=/usr/local/etc/openssl/cert.pem
nas configurações do php.ini ou do Zend Server (em OpenSSL).Um pacote de certificados também está disponível em curl / Mozilla no site do curl: https://curl.haxx.se/docs/caextract.html
Dizendo ao PHP onde estão os certificados
Depois de ter um pacote, coloque-o onde o PHP já está procurando (que você descobriu acima) ou atualize
openssl.cafile
no php.ini. (Geralmente,/etc/php.ini
ou/etc/php/7.0/cli/php.ini
ou/etc/php/php.ini
no Unix.)fonte
openssl_get_cert_locations
, isso tornou a depuração muito mais fácil. Parece que o WAMP usa arquivo ini diferente para o apache php e para o console php. No meu caso, eu tive que adicionaropenssl.cafile="c:/_/cacert.pem"
para php baseado em console. Da última vez, ao usá-lo através do apache, eu precisavacurl.cainfo="c:/_/cacert.pem"
fazê-lo funcionar.O Guzzle, usado pelo cartalista / faixa , fará o seguinte para encontrar um arquivo de certificados adequado para verificar um certificado de servidor:
openssl.cafile
está definido no seu arquivo php.ini.curl.cainfo
está definido no seu arquivo php.ini./etc/pki/tls/certs/ca-bundle.crt
existe (Red Hat, CentOS, Fedora; fornecido pelo pacote ca-certificates)/etc/ssl/certs/ca-certificates.crt
existe (Ubuntu, Debian; fornecido pelo pacote ca-certificates)/usr/local/share/certs/ca-root-nss.crt
existe (FreeBSD; fornecido pelo pacote ca_root_nss)/usr/local/etc/openssl/cert.pem
(OS X; fornecido pelo homebrew)C:\windows\system32\curl-ca-bundle.crt
existe (Windows)C:\windows\curl-ca-bundle.crt
existe (Windows)Você deseja certificar-se de que os valores para as duas primeiras configurações sejam definidos corretamente fazendo um teste simples:
Como alternativa, tente gravar o arquivo nos locais indicados por # 7 ou # 8.
fonte
Se você não conseguir alterar o php.ini, também poderá apontar para o arquivo cacert.pem a partir de código como este:
fonte
O que eu fiz foi usar
var_dump(openssl_get_cert_locations()); die;
em qualquer script php, o que me deu as informações sobre os padrões que meu php local estava usando:Como você pode notar, eu configurei o ini_cafile ou a opção ini curl.cainfo. Mas no meu caso, o curl tentaria usar o "default_cert_file" que não existia.
Copiei o arquivo de https://curl.haxx.se/ca/cacert.pem no local para "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) e consegui obtê-lo trabalhar.
Esta foi a única solução para mim.
fonte
Eu tive esse problema parecer inesperado um dia, quando um script do Guzzle (5) estava tentando se conectar a um host por SSL. Claro, eu poderia desativar a opção VERIFY no Guzzle / Curl, mas claramente esse não é o caminho correto.
Eu tentei de tudo listado aqui e em threads semelhantes, e finalmente fui para o terminal com openssl para testar o domínio com o qual estava tentando conectar:
... e recebeu as primeiras linhas indicando:
... enquanto tudo funcionava bem ao tentar outros destinos (por exemplo: google.com, etc)
Isso me levou a entrar em contato com o domínio com o qual eu estava tentando conectar-me e, de fato, eles tiveram um problema em THE END END que havia surgido. Foi resolvido e meu script voltou a funcionar.
Então ... se você estiver arrancando os cabelos, dê uma chance ao openssl e veja se há algo com a resposta do local que você está tentando conectar. Talvez o problema não seja tão 'local', afinal de contas, às vezes.
fonte
Encontrei uma solução que funcionou para mim. Eu fiz o downgrade do último guzzle para a versão ~ 4.0 e funcionou.
No compositer.json, adicione "guzzlehttp / guzzle": "~ 4.0"
Espero que ajude alguém
fonte
Certifique-se de abrir o
php.ini
arquivo diretamente pelo seu Windows Explorer. (no meu casoC:\DevPrograms\wamp64\bin\php\php5.6.25
:).Não use o atalho
php.ini
no menu do ícone Wamp / Xamp na bandeja do sistema. Este atalho não funciona neste caso.Então edite isso
php.ini
:e
Após salvar,
php.ini
você não precisa "Reiniciar todos os serviços" no ícone Wamp ou fechar / reabrir o CMD.fonte
Você tentou..
Se você está consumindo uma fonte confiável, sem dúvida não precisa verificar o certificado SSL.
fonte
Eu gastei muito tempo para descobrir esse problema para mim.
Eu tinha o PHP versão 5.5 e precisava atualizar para a 5.6.
Nas versões <5.6, o Guzzle usará seu próprio arquivo cacert.pem, mas nas versões superiores do PHP usará o arquivo cacert.pem do sistema.
Também baixei o arquivo aqui https://curl.haxx.se/docs/caextract.html e o configurei no php.ini.
Resposta encontrada no arquivo Guzzles StreamHandler.php https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437
fonte
Todas as respostas estão corretas ; mas o mais importante é que você precisa encontrar o arquivo php.ini certo. marque este comando no cmd "php --ini" não é a resposta certa para encontrar o arquivo php.ini certo.
se você editar
e verifique
então curl.cainfo deve ter um valor. caso contrário, isso não é o arquivo php.ini certo;
* Eu recomendo que você pesquise * .ini em wamp / bin ou xxamp / bin ou em qualquer servidor que você use, altere-os um por um e verifique-o. *
fonte
Acabei de experimentar esse mesmo problema com o framework Laravel 4 php, que usa o
guzzlehttp/guzzle
pacote compositor. Por alguma razão, o certificado SSL para mailgun parou de validar repentinamente e recebi a mesma mensagem de "erro 60".Se, como eu, você estiver em uma hospedagem compartilhada sem acesso
php.ini
, as outras soluções não serão possíveis. De qualquer forma, o Guzzle tem este cliente inicializando o código que provavelmente anularia osphp.ini
efeitos:Aqui, o Guzzle força o uso de seu próprio arquivo cacert.pem interno, que provavelmente está agora desatualizado, em vez de usar o fornecido pelo ambiente do cURL . Alterar essa linha (pelo menos no Linux) configura o Guzzle para usar a lógica de verificação SSL padrão do cURL e corrigiu o meu problema:
Você também pode definir isso
false
se não se importar com a segurança da sua conexão SSL, mas essa não é uma boa solução.Como os arquivos
vendor
não devem ser adulterados, uma solução melhor seria configurar o cliente Guzzle no uso, mas isso era muito difícil de fazer no Laravel 4.Espero que isso economize para alguém mais algumas horas de depuração ...
fonte
Pode ser um caso extremo, mas, no meu caso, o problema não era o cliente conf (eu já havia
curl.cainfo
configuradophp.ini
), mas o servidor remoto não está sendo configurado corretamente:Não enviou nenhum certificado intermediário na cadeia. Não houve erro ao navegar no site usando o Chrome, mas com o PHP recebi o seguinte erro.
Depois de incluir os certificados intermediários na configuração do servidor da web remoto, ele funcionou.
Você pode usar este site para verificar a configuração SSL do seu servidor:
https://whatsmychaincert.com/
fonte
quando corro
'var_dump(php_ini_loaded_file());'
, recebo essa saída na minha página'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'
e para obter o php para carregar meu arquivo cert, tive que editar o php.ini nesse caminho
'C:\Development\bin\apache\apache2.4.33\bin\php.ini'
e adicionaropenssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"
onde havia baixado e colocar meu arquivo cert em https://curl.haxx.se/docs/caextract.htmlestou no windows 10, usando drupal 8, wamp e php7.2.4
fonte
Eu tenho uma solução adequada para esse problema, vamos tentar entender a causa raiz desse problema. Esse problema ocorre quando os servidores remotos ssl não podem ser verificados usando certificados raiz no armazenamento de certificados do sistema ou o ssl remoto não está instalado junto com os certificados em cadeia. Se você possui um sistema linux com acesso root ssh, nesse caso, você pode tentar atualizar seu armazenamento de certificados com o comando abaixo:
update-ca-certificates
Se ainda assim, não funcionar, você precisará adicionar o certificado intermediário e raiz do servidor remoto em seu armazenamento de certificados. Você pode fazer o download de certificados raiz e intermediários e adicioná-los no diretório / usr / local / share / ca-certificates e, em seguida, executar o comando
update-ca-certificates
. Isso deve fazer o truque. Da mesma forma, no Windows, você pode pesquisar como adicionar certificados raiz e intermediário.A outra maneira de resolver esse problema é pedir à equipe do servidor remoto para adicionar o certificado ssl como um pacote de certificação raiz do domínio, certificação intermediária e certificação raiz.
fonte
Como você está usando o Windows, acho que seu separador de caminho é '\' (e '/' no Linux). Tente usar a constante
DIRECTORY_SEPARATOR
. Seu código será mais portátil.Experimentar:
EDIT: e escreva o caminho completo. Eu tive alguns problemas com caminhos relativos (talvez o curl seja executado em outro diretório base?)
fonte
se você usa o WAMP, também deve adicionar a linha de certificado no php.ini para Apache (além do arquivo php.ini padrão):
funciona para php5.3 +
fonte