SSL Connect Error - Webservice João Pessoa/PB

Um dos certificados da prefeitura de João Pessoa está expirado e por conta disso nossa integração parou de funcionar. Em contato com eles, foi informado que estão resolvendo mas não tinham previsão ainda para renovação do certificado.

Hoje, fazem 33 dias desse problema

Recentemente, resolvemos fazer alguns testes na tentativa de arrumar uma solução de fazer funcionar a integração sem precisar esperar pela boa vontade deles.

Conseguimos fazer funcionar, após alteração dessas variáveis, CURLOPT_SSL_VERIFYHOST e CURLOPT_SSL_VERIFYPEER. Atualmente está assim.

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2000);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 4000);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSLVERSION, 0);
    curl_setopt($ch, CURLOPT_CAINFO, APPLICATION_PATH . '/ca.pem');
    curl_setopt($ch, CURLOPT_SSLCERT, APPLICATION_PATH . '/../data/wsdls/nfse/certificate.pem');
    curl_setopt($ch, CURLOPT_SSLKEY, APPLICATION_PATH . '/private.pem');
    curl_setopt($ch, CURLOPT_KEYPASSWD, 'xxxxxxxxx');
    curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'xxxxxxxxx');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_CERTINFO, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $parameters);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);

Conseguimos fazer funcionar em nosso ambiente local, porém em produção está retornando o erro “SSL connect error”.

Não entendo muito dessa parte, mas ao meu ver, é como se em produção nosso servidor fosse mais rigoroso e não deixa passar havendo qualquer erro com o certificado.

Alguém pode me explicar o que pode ser e se tem alguma sugestão? Agradeço a ajuda!

No caso o problema é o excesso de parâmetros mesmo.
Não precisa de todos esses.

curl_setopt($ch, CURLOPT_SSLVERSION, 0);

Esse principalmente!
Isso força o tipo de SSL.

Verificando novamente, o Certificado foi atualizado em 04/11/2020:

image

O Windows entende esse certificado como válido se a cadeia estiver instalada corretamente.

image

O problema é que o servidor usa o protocolo TLS 1.0.
Esse protocolo não é mais seguro.

image

O Chrome e o Explorer não vão deixar acessar o site.
Mesmo marcando esses protocolos.

image

Apenas o Firefox permite o acesso através da lista de exceção.

No PHP, você pode forçar a conexão via TLS 1.0:
CURL_SSLVERSION_TLSv1_0 (4)

https://www.php.net/manual/en/function.curl-setopt.php

Aqui eu explico como acessar o site usando o Chrome:
Acessando o site da PMPJ com Certificado Inválido no Chrome 86

Obrigado por todos os esclarecimentos. O problema foi resolvido essa semana, pois eles renovaram o certificado e enviaram uma nova cadeia de certificados intermediários que precisava ser atualizada. Após isso voltou a funcionar a integração via webservice.

Sim, na verdade são 2 problemas:

  • TLS v1.0 que agora está obsoleto
    image

  • Certificado do Servidor com Cadeia Incompleta
    image

Estou tentando contato com o suporte da prefeitura para que eles coloquem o servidor usando TLS v1.2.
Com isso os clientes não verão o primeiro erro.

No entanto, seu servidor em produção precisa ser aceitar o TLS v1.0 através do OpenSSL.
Isso pode ser feito assim:
OpenSSL can't establish SSL connection because unsupported protocol - Stack Overflow

Quanto ao segundo erro, precisa ir na VALID e instalar a cadeia de certificados deles.
https://www.validcertificadora.com.br/hierarquia

Existe um executável para o Windows:
https://s3-sa-east-1.amazonaws.com/shared-www.validcertificadora.com.br/InstaladorCadeias_1.0.2.0.exe

Mas usando a opção de ignorar certificado desconhecido vai resolver.

Este tópico foi fechado automaticamente 30 dias depois da úlima resposta. Novas respostas não são mais permitidas.