Executando verificação de segurança...
2

❌ Antigo PHP 5, cURL e TLS 1.2 = SSL connect error

old PHP cURL TLS1.2

Criei este artigo no medium e resolvi trazer para cá caso seja útil para alguém.

Contextualizando

Você tem bons e velhos projetos PHP que nunca quebram, funcionam bem e você não precisa se preocupar com isso. Mas você está usando cURL para conexões de API e derepente, recebe o erro:

    erro de conexão SSL

Imediatamente você pensa... será fácil de consertar. Apenas force o cURL a ignorar as verificações de SSL:

    ...
    CURLOPT_SSL_VERIFYPEER => falso,
    CURLOPT_SSL_VERIFYHOST => falso,
    ...

Agora é só relaxar e testar:

    erro de conexão SSL

Nesse momento você começa a ter medo de como consertar. Quando você tem uma ideia. Force a versão TLS e cruze os dedos para funcionar

    $ch = curl_init('https://google.com/');

    //Força requsts para usar TLS 1.2
    curl_setopt ($ch, CURLOPT_SSLVERSION, 6);

    $resultado = curl_exec($ch);
    curl_close($ch);

E de novo :

    erro de conexão SSL

Ok, talvez agora seja um bom momento para começar a chorar.

A solução

Deixando as piadas de lado, o que acontece é que o cURL não pode realmente forçar o TLS, mesmo se configurado para ignorar o SSL ou usar o TLS versão X.

Por outro lado, pode ser impossível atualizar a infraestrutura de alguns sistemas, ainda mais se forem isolados e projetados há muito tempo usando versões antigas do Apache e PHP.

Mas para nossa sorte, temos stream_context 👏👏👏

O stream_context cria e retorna um stream com todas as opções fornecidas.

    stream_context_create(?array $options = null, ?array $params = null): recurso

Igual ao cURL, usando o contexto de fluxo, você pode definir cabeçalhos, métodos e passar parâmetros. Assim :

$opções = array(
   'http'=>array(
     'método'=>"GET",
     'header'=>"Aceitar idioma: en\r\n" .
               "Cookie: foo=bar\r\n"
   )
);

$context = stream_context_create($opts);

/* Envie uma solicitação http para www.example.com
    com cabeçalhos adicionais mostrados acima */
$fp = fopen('http://www.example.com', 'r', false, $contexto);
fpassthru($fp);
fclose($fp);

Uma razão pela qual stream_context_create pode funcionar quando cURL não é que ele o stream_context_create pode ser mais tolerante com problemas de servidor ou rede que podem causar falha no cURL. Por exemplo, se um certificado de servidor for inválido ou expirado, cURL pode falhar ao conectar, enquanto stream_context_create ainda pode estabelecer uma conexão se a opção Verify_peer estiver definida como false.

Uau, essa foi perto!

Finalmente, temos uma solução e quero compartilhá-la com você. Talvez isso possa te ajudar a dormir melhor :)

    // Exigindo TLS 1.2:
    $ctx = stream_context_create([
         'ssl' => [
             'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
         ]
    ]);
    $html = file_get_contents('https://google.com/', false, $ctx);

Espero que ajude você!

Abraço e vamos nos manter conectados
no Linkedin !

Carregando publicação patrocinada...