Usando cURL para acessar sites https (SSL/TLS)

Hoje iremos explicar como acessar sites seguros (https) com cURL, ao tentar acessar como no exemplo abaixo:

$url = "https://endereco.do.site";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resposta = curl_exec($ch);
curl_close($ch);

Recebemos o seguinte erro:

Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Existem duas formas de corrigir este problema:

1. Ignorar a verificação do certificado SSL (menos segura):

Adicione a linha abaixo:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Exemplo:

$url = "https://endereco.do.site";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$resposta = curl_exec($ch);
curl_close($ch);

Ao fazer isto o servidor aceitará qualquer certificado, não sendo a forma mais segura/recomendada se dados sensíveis estão sendo trocados entre servidores.

2. Forma correta (segura):

Primeiro precisamos obter o certificado usado no site, você pode fazer isto acessando o site e clicando no ícone de segurança da página (cadeado), em seguida exporte o certificado e envie o arquivo para o servidor.

Agora adicionaremos o certificado na verificação do cURL:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, "/caminho/do/certificado.crt");

Exemplo:

$url = "https://endereco.do.site";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, "/caminho/do/certificado.crt");
$resposta = curl_exec($ch);
curl_close($ch);

Fazendo isto o cURL verificará se o certificado SSL usado no site é o mesmo informado por você e nenhuma mensagem de erro será exibida.

Total de Visualizações: 6.050