Author Image

luizfeleal

Aug 27, 2024

Erro ao Configurar Arquivo PEM em Projeto de API

erroarquivo .pemAPIconfiguraçãochave privadaconversão

Olá, bom dia! Estou tendo um erro ao tentar enviar uma requisição para me autenticar com a API. O erro é o seguinte:
Exception: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0 in file.
Conseguem me ajudar?

Respostas (12):
Avatar discord do usuario joaolucas_efi

joaolucas_efi

27/08/2024

Bom dia, @luizfeleal, tudo bem?
Como você esta fazendo a requisição?

Avatar discord do usuario luizfeleal

luizfeleal

27/08/2024

$credenciaisBase64 = base64_encode($cliente_id . ":" . $client_secret);

$url = env('URL_EFI') . "/oauth/token";

// Inicializa a sessão cURL
$ch = curl_init();


curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // Verifica o certificado do servidor
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // Verifica o host do certificado
curl_setopt($ch, CURLOPT_SSLCERT, $certificado); // Define o certificado a ser usado


// Adiciona os dados do cliente como autenticação básica
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/x-www-form-urlencoded',
"Authorization: Basic " . $credenciaisBase64

]);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'grant_type' => 'client_credentials',
]));

// Executa a requisição e obtém a resposta
$resposta = curl_exec($ch);

Avatar discord do usuario joaolucas_efi

joaolucas_efi

27/08/2024

@luizfeleal existem algumas falha em como você montou a requisição, segue um exemplo de como fazer a autenticação:

php
//Desenvolvido pela Consultoria Técnica da Efí
$config = [
"certificado" => "./certificado.pem",
"client_id" => "YOUR-CLIENT-ID",
"client_secret" => "YOUR-CLIENT-SECRET"
];
$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "https://pix-h.api.efipay.com.br/oauth/token", // Rota base, homologação ou produção
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));

$response = curl_exec($curl);

curl_close($curl);

echo "
";
echo $response;
echo "
";
?>

Avatar discord do usuario luizfeleal

luizfeleal

27/08/2024

Agora o erro retornado é esse:
Exception: unable to set private key file: '/projeto_maquina_api/storage/app/Certificados/certificate12.pem' type PEM in file /projeto_maquina_api/app/Services/Efi/AuthService.php on line 59

Avatar discord do usuario joaolucas_efi

joaolucas_efi

27/08/2024

@luizfeleal tente fazer com o arquivo .p12, por favor.

Avatar discord do usuario luizfeleal

luizfeleal

27/08/2024

recebi esse erro com o arquivo .p12:
Exception: could not load PEM client certificate from /projeto_maquina_api/storage/app/Certificados/certificate12.p12, OpenSSL error error:0480006C:PEM routines::no start line, (no key found, wrong pass phrase, in file /projeto_maquina_api/app/Services/Efi/AuthService.php on line 62

Avatar discord do usuario joaolucas_efi

joaolucas_efi

27/08/2024

@luizfeleal verifiquei aqui e o arquivo é .pem mesmo. Como você fez a conversão do arquivo para .pem?

Avatar discord do usuario luizfeleal

luizfeleal

27/08/2024

Eu tenho um código em php que faz isso, e também já testei utilizando o conversor de vocês, mas o mesmo erro é retornado

Avatar discord do usuario joaolucas_efi

joaolucas_efi

27/08/2024

@luizfeleal uma coisa que pode estar ocasionando a falha é o caso o caminho do certificado esteja incorreto, verifique se o arquivo esta de fato sendo encontrado.

Avatar discord do usuario luizfeleal

luizfeleal

27/08/2024

eu faço essa verificação:
if (!file_exists($certificado) || !is_readable($certificado)) {
throw new \Exception("O arquivo de certificado não foi encontrado: " . $certificado);
}

Avatar discord do usuario luizfeleal

luizfeleal

27/08/2024

e passa certinho

Avatar discord do usuario joaolucas_efi

joaolucas_efi

27/08/2024

@luizfeleal vou abrir um atendimento para podermos verificar algumas informações junto à você.