PHP - erro de certificado SSL: não é possível obter o certificado do emissor local


189

Estou executando o PHP versão 5.6.3 como parte do XAMPP no Windows 7.

Quando tento usar a API Mandrill, estou recebendo o seguinte erro:

Exceção não capturada 'Mandrill_HttpError' com a mensagem 'Falha na chamada da API / modelo de envio: Problema no certificado SSL: não é possível obter o certificado do emissor local'

Eu já tentei tudo o que li no StackOverflow, incluindo a adição do seguinte ao arquivo php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

E, é claro, baixou para esse local o arquivo cacert.pem em http://curl.haxx.se/docs/caextract.html

mas depois de tudo isso, reiniciei o servidor XAMPP e Apache, mas continuando recebendo o mesmo erro.

Realmente não sei mais o que tentar.

Alguém pode aconselhar sobre o que mais posso tentar?



3
Verifique também se você descomentou essa linha removendo o ';' inicial. deve ser curl.cainfo = "C: \ xampp \ php \ cacert.pem" em vez de; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan

O uso de HTTPS sobre HTTP também causaria esse erro?
Javiniar.leonard

Respostas:


366

Finalmente consegui que isso funcionasse!

  1. Faça o download do pacote de certificados .

  2. Coloque em algum lugar. No meu caso, esse foi o c:\wamp\diretório (se você estiver usando o Wamp de 64 bits, será c:\wamp64\).

  3. Ative mod_sslno Apache e php_openssl.dllno php.ini(remova ;o comentário removendo -o no início). Mas tenha cuidado, meu problema era que eu tinha dois php.iniarquivos e preciso fazer isso nos dois. Um é o que você obtém do ícone da barra de tarefas do WAMP e outro é, no meu caso, emC:\wamp\bin\php\php5.5.12\

  4. Adicione estas linhas ao seu certificado nos dois php.iniarquivos:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
    
  5. Reinicie os serviços Wamp.


3
No meu caso, que foi c: \ xamp \ diretório e seus windows 7 e esta solução funciona perfect..thanks muito ...
Manu RS

1
O pacote de certificados mais novo pode ser baixado no site original do curl curl.haxx.se/docs/caextract.html
Paul

1
No meu caso, a linha tinha um ;no início e levei horas para perceber que isso significa que é um comentário. assim para noobs como eu, é preciso remover o ;bem
abhyudayasrinet

1
@SurajNeupane não tenho certeza, eu gastei muito tempo para recuperar este, então eu uso máquinas virtuais, como Homestead e não preciso lidar com isso. Este foi um caso específico
Mladen Janjetovic

2
Isso é fundamentalBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

Isenção de responsabilidade: este código torna seu servidor inseguro.

Eu tive o mesmo problema no arquivo Mandrill.php após a linha número 65, onde diz $ this-> ch = curl_init ();

Adicione as seguintes duas linhas:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

Isso resolveu o meu problema e também enviou e-mails usando o localhost, mas sugiro NÃO usá-lo na versão ao vivo. No seu servidor ativo, o código deve funcionar sem esse código.


1
alguma coisa que eu possa tentar fazer meu ambiente de desenvolvedores funcionar sem esse desvio?
Dor Dadush

4
para mim, apenas definindo CURLOPT_SSL_VERIFYPEERpara falsetrabalhar.
Francisco Corrales Morales

29
Enquanto você estiver tecnicamente correto, desabilitar o SSL é uma má idéia. Mesmo no host local, é melhor carregar corretamente os certificados, conforme mencionado na outra resposta.
Spinal

Enquanto você estiver tecnicamente correto, desabilitar o SSL é uma má idéia. Mesmo que seja veementemente resistente a começar a trabalhar de outra maneira, é melhor perder o emprego do que fazer as coisas da maneira inadequada de administrador de sistemas. @Spinal

45

Obrigado @Mladen Janjetovic,

Sua sugestão funcionou para mim no mac com os ampps instalados.

Copiado: http://curl.haxx.se/ca/cacert.pem

Para: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

E atualizado php.inicom esse caminho e reiniciei o Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

E aplicou a mesma configuração na instalação do Windows AMPPS e também funcionou perfeitamente nela.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: O mesmo para o wamp.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Se você está procurando gerar um novo certificado SSL usando o SAN para localhost, as etapas nesta postagem funcionaram para mim Centos 7 / Vagrant / Chrome Browser.


18

Ao visualizar a página http://curl.haxx.se/docs/caextract.html , você notará em grandes letras uma seção chamada:

RSA-1024 removido

Leia e faça o download da versão dos certificados que incluem os certificados 'RSA-1024'. https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Aqueles trabalharão com Mandrill.

Desabilitar o SSL é uma má ideia.


1
Isso corrigiu um problema com o AWS / Guzzle / cURL com o qual tenho lutado o dia todo. Obrigado!
voidstate

@voidstate Eu sei que isso é antigo, mas você também pode ignorá-lo no guzzle usando este ['confirm' => false], para obter o documento completo sobre ssl / curl / guzzle, vá aqui guzzle.readthedocs.org/en/latest/…
John

@ John, mas isso desmentiria a verificação SSL, que não é o que você deseja fazer, por isso não sugeriria isso.
Arturo Alvarado

1
No Windows, você precisará salvar os arquivos em seu servidor (por exemplo, em C: \ curl \ curl-ca-bundle.crt) e adicione o seguinte ao seu php.ini: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

Eu só tive isso depois que funcionou perfeitamente por muito tempo (até sobreviveu a uma mudança de servidor), mas estou tendo problemas para entender exatamente o que está acontecendo aqui. É que curl ou openssl foi atualizado e teve o pacote CA alterado para um incompatível com o mailchimp?
Sammaye

11

As etapas acima, apesar de úteis, não funcionaram para mim no Windows 8. Não conheço a correlação, mas as etapas abaixo funcionaram. Basicamente, uma alteração no arquivo cacert.pem. Espero que isso ajude alguém.

  • Faça o download do arquivo cacert.pem aqui: http://curl.haxx.se/docs/caextract.html
  • Salve o arquivo na sua pasta de instalação do PHP. (por exemplo: se estiver usando o xampp - salve-o em c: \ Installation_Dir \ xampp \ php \ cacert.pem).
  • Abra seu arquivo php.ini e adicione estas linhas:
  • curl.cainfo = "C: \ Diretório de instalação \ xampp \ php \ cacert.pem" openssl.cafile = "C: \ Diretório de instalação \ xampp \ php \ cacert.pem"
  • Reinicie o servidor Apache e isso deve corrigi-lo (basta parar e iniciar os serviços, conforme necessário).

11

Encontrei uma nova solução sem a certificação necessária para chamar o curl e adicione apenas dois códigos de linha.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
Embora isso possa funcionar, isso não é recomendado. Você está basicamente dizendo, confie em todos os certificados ... e também abrirá seu aplicativo para possível ataque se você esquecer e seu código entrar em produção com essa alteração ... realmente não é muito trabalhoso baixar o pacote CA e adicione ponto PHP a ele.
user919426

que é o conceito de onda, por isso sempre que você está a utilizar onda não adicionar o código acima
Manish Sharma

8

Se você não tem acesso ao php.ini , adicionar este código (após a sua $ch = curl_init();linha) funciona para mim:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

Em seguida, basta baixar o ca-bundle.crt e salvá-lo no local especificado em $certificate_location.


3

Eu tenho uma solução muito simples deste problema. Você pode fazer isso sem nenhum arquivo de certificado.

Vá em Laravel Root Folder -> Vender -> guzzlehttp -> guzzle -> src

abra Client.php

encontre $ padrão Matriz. que se parecem assim ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Agora, o trabalho principal é alterar o valor da chave de verificação .

'verify'          => false,

Portanto, depois disso, ele não verificará o certificado SSL para solicitação de CURL ... Esta solução é útil para mim. Acho essa solução depois de muitas pesquisas ...


2

elaborando as respostas acima para implantação do servidor.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

deve fazer o truque para o ambiente de desenvolvimento sem comprometer o servidor quando implantado.


Executar diferentes partes de seu código em diferentes ambientes não soa como um bom conceito - que torna a depuração mais difícil
Nico Haase

2

Eu tentei isso funciona

abrir

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

e mude isso

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

para isso

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

0

Eu tive o mesmo problema durante a criação do meu aplicativo no AppVeyor.

  • Faça o download de https://curl.haxx.se/ca/cacert.pem parac:\php
  • Ativar openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Localizar certificadoecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

Se nenhuma das soluções acima estiver funcionando, tente atualizar a instalação do XAMPP para uma versão mais recente.

Eu estava executando o XAMPP com o php 5.5.11, o mesmo código exato não funcionou, atualizei para o XAMPP com o php 5.6.28 e as soluções acima funcionaram.

Além disso, apenas a atualização do PHP não funcionou parece uma combinação de configurações de apache e php nessa versão do XAMPP.

Espero que ajude alguém.


0

Eu recebi o erro como:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Eu estou usando a máquina windows. Então, eu segui os passos abaixo.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

Espero que ajude alguém


0

Eu estava enfrentando um problema como esse no meu sistema local, mas não no servidor ativo. Eu também mencionei outra solução nesta página antes, mas que não estava funcionando no localhost .Então, encontre uma nova solução disso, que esteja funcionando no localhost-WAMP Server .

Erro cURL: problema no certificado SSL: não é possível obter o certificado do emissor local

Às vezes, o sistema não conseguiu encontrar o seu cacert.pem na sua unidade. para que você possa definir isso no seu código em que usará CURL

Observe que estou cumprindo todas as condições para isso, como a biblioteca OPEN-SSL ativa e outras coisas.

verifique este código de CURL .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

mas esta solução pode não funcionar no servidor ativo. por causa do caminho absoluto do cacert.pem


0

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, adicioná-los ao diretório / usr / local / share / ca-certificates e 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 é solicitar à equipe de servidores remotos que adicione o certificado ssl como um pacote de certificação raiz do domínio, certificação intermediária e certificação raiz.


-4

para guzzle, você pode tentar o seguinte:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

testado no guzzle / guzzle 3. *


1
existe um ponto em responder a uma pergunta antiga de 3 anos que tenha uma resposta aceita com mais de 200 votos positivos?
treyBake

minha resposta é mais simples do que as anteriores, você verá que receberei 10
votos positivos

1
Eu duvido muito, não vendo nenhuma menção ao guzzle no OP ... então é uma resposta não relacionada. É o mesmo quando alguém fornece uma solução jQuery para um problema de JavaScript. É irrelevante.
treyBake

isso não muda o fato de não estar sendo usado aqui. Você sugeriria uma solução Linux para um usuário Windows porque é o sistema operacional de servidor mais usado? Nem todo mundo quer usar o Guzzle, eu pessoalmente nunca o usei uma vez nos meus anos de uso do PHP. Para mim, uma solicitação HTTP realmente não é tão difícil de precisar de um pacote.
treyBake

1
totalmente consciente - simplesmente não é necessário. Basta ler os documentos para curl e é tudo auto-explicativo. Não se trata de ser mais inteligente ... é sobre respondendo a pergunta corretamente
treyBake
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.