❌ Antigo PHP 5, cURL e TLS 1.2 = SSL connect error
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 !