Conexão segura SSL com CURL

Neste post vamos ver um exemplo de utilização do CURL no PHP para retornar informações de um link através de uma conexão segura (SSL/HTTPS).

$url = 'https://api.twitter.com/1/statuses/public_timeline.json';
$req = curl_init($url);
curl_setopt($req, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($req);

Claro que, se a extensão CURL foi ativada sem que a localização do pacote de certificados confiáveis tenha sido configurada, o exemplo acima irá falhar. Para bibliotecas que pretendem ser distribuídas publicamente, o programador terá de seguir um padrão para garantir que mesmo quando a localização do pacote de certificados confiáveis não tenha sido configurada, o seu código ainda funcione através da identificação manual e local do pacote de certificados, como no exemplo abaixo:

$url = 'https://api.twitter.com/1/statuses/public_timeline.json';
$req = curl_init($url);
curl_setopt($req, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($req);

/**
 * Check if an error is an SSL failure and retry with bundled CA certs on
 * the assumption that local server has none configured for ext/curl.
 * Error 77 refers to CURLE_SSL_CACERT_BADFILE which is not defined as
 * as a constant in PHP's manual for some reason.
 */
$error = curl_errno($req);
if ($error == CURLE_SSL_PEER_CERTIFICATE || $error == CURLE_SSL_CACERT
|| $error == 77) {
    curl_setopt($req, CURLOPT_CAINFO, __DIR__ . '/cert-bundle.crt');
    $result = curl_exec($req);
}

/**
 * Any subsequent errors cannot be recovered from while remaining
 * secure. So do NOT be tempted to disable SSL and try again ;).
 */

A parte complicada de utilizar conexão segura em servidores que não configuraram a localização do pacote de certificados confiáveis na inicialização da extensão CURL é que o browser pode revogar o certificado de um site a qualquer momento, por uma infinidade de motivos. Para evitar o transtorno de ter seu código inoperante por um longo período em caso de revogação de certificado, é interessante distribuir junto do seu código uma cópia do arquivo .crt do certificado requerido pelo seu código ou aplicativo e criar uma rotina para verificar se o certificado permanece válido. Caso seja identificado que o certificado não é mais válido, você pode implementar uma rotina para atualizar seu arquivo .crt para a última versão do certificado, tornando sua aplicação funcional novamente.

Se você não sabe como fazer para verificar e atualizar seu arquivo de certificados confiáveis .crt, você pode utilizar a ferramente Sslurp para PHP disponível em: https://github.com/EvanDotPro/Sslurp.

Fonte: http://phpsecurity.readthedocs.org/en/latest/Transport-Layer-Security-(HTTPS-SSL-and-TLS).html

Marcos de P. Muniz

Graduado em Sistemas de Informação pela UEMG, é Pós Graduado em Segurança da Informação pela Faculdade Pitágoras, é desenvolvedor PHP desde 2006, trabalha como Analista / Desenvolvedor em uma empresa que atua na área de ensino a distância, faz freelancer criando sites, sistemas e portais utilizando PHP, MySQL e jQuery.

Você pode gostar...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *