Quando você trabalha com microserviços, testes locais ou sistemas distribuídos que se comunicam por HTTPS, é comum cair na situação onde o servidor local (localhost) utiliza um certificado SSL inválido ou autossinado. Isso, por padrão, faz com que o cURL no PHP recuse a conexão por não confiar no certificado.
Ignorar o SSL completamente não é uma boa prática. Fazer isso em produção é um convite para ataques. No entanto, em ambiente de desenvolvimento, especialmente quando lidamos com localhost, podemos desativar essa verificação apenas quando for seguro e necessário.
O problema
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://localhost/api/teste");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
// Falha: cURL error 60: SSL certificate problem
A solução incorreta (e perigosa)
Muitos tutoriais sugerem:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Isso desativa completamente a verificação SSL, o que pode permitir ataques de man-in-the-middle. Não use isso sem controle. Faça direito.
A solução correta: condicional apenas para localhost
Se sua aplicação vai rodar em produção, mas também precisa funcionar localmente, condicione a desativação do SSL ao domínio:
$url_servidor = "https://localhost/api/teste";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_servidor);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
// Desativa o SSL somente se for localhost
if (strpos($url_servidor, 'https://localhost') === 0) {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Erro cURL: ' . curl_error($ch);
}
curl_close($ch);
Por que funciona?
A função strpos() verifica se a URL começa com https://localhost. Isso garante que a verificação SSL só será desativada nesse cenário específico. Isso mantém o ambiente de produção protegido, enquanto permite testes locais sem dor de cabeça.
Conclusão
Desabilitar SSL no cURL deve ser uma exceção controlada, nunca um padrão. Com uma simples verificação de domínio, você mantém segurança e praticidade, sem cair em armadilhas comuns que comprometem todo o sistema.
