Erro cURL 60 no PHP: problema com o certificado SSL, e por que não desativar a verificação

PHP e Programação··· 337 visualizações· 4 min de leitura

“cURL error 60: SSL certificate problem” quer dizer que o PHP ligou-se a um serviço por HTTPS e não confiou no certificado que esse serviço apresentou. O PHP está fazendo o que deve: recusar falar com um servidor cuja identidade não consegue provar. A solução quase nunca é desativar a verificação. É descobrir de que lado está a falha: no certificado do outro serviço, ou nos certificados de confiança do seu lado.

As mensagens e o que apontam

A mensagem Causa provável De quem é
certificate has expired O certificado do serviço de destino expirou. Do serviço de destino. Avise-o.
unable to get local issuer certificate Falta um certificado intermediário no servidor de destino, ou o seu lado tem uma lista de certificados de confiança antiga ou incompleta. Dos dois: veja os passos abaixo.
self signed certificate O destino usa um certificado criado por si próprio e não emitido por uma entidade reconhecida. Do destino. Comum em ambientes de teste.
no alternative certificate subject name matches O certificado é de um nome diferente do endereço chamado. Do código (endereço errado) ou do destino.

Descobrir de que lado está a falha

1 Abra o endereço do serviço no navegador. Se o navegador também avisa, o problema é do certificado do destino. O navegador por vezes “remenda” um certificado intermédio em falta que o PHP não remenda: se o navegador não avisa e o PHP sim, suspeite disso.
2 Veja os detalhes com o cURL, se a sua conta tem Terminal: curl -vI https://servico.tld/. A saída mostra a cadeia e a razão da recusa.
3 Use um verificador de SSL público sobre o endereço de destino. Mostra se a cadeia de certificados está completa e quando expira.
4 Confira o seu lado. Aqui a configuração de origem do PHP não fixa um arquivo de certificados (as opções curl.cainfo e openssl.cafile vêm vazias), por isso o PHP usa os do sistema. Se o erro é só de uma aplicação, ela pode trazer o seu próprio arquivo de certificados antigo: atualize a aplicação, ou o plugin que faz a chamada. Veja atualizar temas e plugins sem partir nada.

A solução, conforme a causa

Causa O que fazer
Certificado do destino expirado ou mal instalado Avisar quem gere o serviço. Do seu lado não há reparação honesta.
Aplicação com certificados antigos Atualizar a aplicação ou o plugin. Veja também que versão do PHP usar.
Certificado próprio (teste) que quer mesmo aceitar Dizer ao PHP em que certificado confiar, com CURLOPT_CAINFO a apontar para o arquivo da entidade. Não desative a verificação.
Num VPS seu Atualizar o pacote de certificados do sistema (ca-certificates). Os comandos são seus; o suporte não os trata. Veja até onde vai o nosso suporte.
Não ponha CURLOPT_SSL_VERIFYPEER a false e deixe ficar. Isso faz o PHP aceitar qualquer certificado, incluindo o de alguém que se meteu pelo meio do link. Serve, no máximo, durante um minuto, num teste, para confirmar o diagnóstico, e tira-se logo. Se um plugin ou um tutorial lhe diz para o deixar assim, desconfie.
Apareceu do nada? O mais comum é um certificado que expirou ou foi renovado com uma cadeia nova. Veja primeiro a data de validade do certificado do serviço. Para o seu próprio site, veja o que é um certificado SSL.

Quer que olhemos para o lado do servidor? Envie-nos o endereço do serviço chamado e a mensagem completa do erro.

Abrir um pedido de suporte

VEJA TAMBÉM

Erro cURL 28, 7 e 6 no PHP

Onde está o log de erros do PHP

O que é um certificado SSL e porque importa

Atualizar temas e plugins sem partir nada

PRODUTO RECOMENDADO

Hospedagem de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde $6.60/mês (plano de 3 anos, com cupom)

Ver planos
Esta resposta foi útil? Sua resposta nos ajuda a melhorar este artigo.