Voltar ao Diminua Blog

Artigo

Desvendando o `openssl s_client` no Linux: Diagnóstico e Debug de Conexões TLS/SSL

Uma ferramenta poderosa para inspecionar e solucionar problemas em conexões seguras.

Desvendando o `openssl s_client` no Linux: Diagnóstico e Debug de Conexões TLS/SSL

No desenvolvimento web moderno, a segurança das comunicações é primordial. A maioria das aplicações web hoje em dia utiliza o protocolo TLS/SSL para criptografar o tráfego entre o cliente e o servidor. Quando surgem problemas de conexão, como certificados inválidos, negociações de ciphers falhas ou erros de handshake, pode ser um desafio diagnosticar a causa raiz. Felizmente, o Linux oferece uma ferramenta de linha de comando incrivelmente útil para essa finalidade: o `openssl s_client`.

O Que é o `openssl s_client`?

O `openssl s_client` é um utilitário que faz parte do pacote OpenSSL, amplamente disponível na maioria das distribuições Linux. Sua principal função é atuar como um cliente genérico para conexões SSL/TLS. Ele permite que você estabeleça uma conexão segura com um servidor em uma porta específica e observe detalhadamente o processo de handshake TLS/SSL, além de permitir o envio e recebimento de dados.

Diferente de um navegador web, que abstrai muitos dos detalhes da conexão TLS/SSL, o `openssl s_client` expõe esses detalhes, tornando-o uma ferramenta inestimável para:

  • Verificar a validade e configuração de certificados SSL/TLS de um servidor.
  • Diagnosticar problemas de handshake TLS/SSL.
  • Testar a compatibilidade com diferentes versões de protocolo TLS/SSL.
  • Inspecionar os ciphers suites negociados.
  • Debugar problemas de conexão em APIs REST ou outros serviços que utilizam HTTPS.

Conectando-se a um Servidor Seguro

A sintaxe básica para usar o `openssl s_client` é:

openssl s_client -connect :

Vamos analisar um exemplo prático. Suponha que você queira inspecionar a conexão com o site do Google:

openssl s_client -connect www.google.com:443

Ao executar este comando, você verá uma saída detalhada. A primeira parte da saída exibirá informações sobre o handshake TLS/SSL:

  • Protocolo e Cipher Suite: Informará qual versão do TLS (por exemplo, TLSv1.2, TLSv1.3) e qual conjunto de cifras (cipher suite) foi negociado com sucesso.
  • Certificado do Servidor: Exibirá o certificado do servidor, incluindo o emissor (Issuer), o assunto (Subject), datas de validade, e informações sobre a chave pública.
  • Chains de Certificados: Mostrará a cadeia de confiança, desde o certificado do servidor até as autoridades certificadoras raiz.
  • Handshake Details: Detalhes sobre o processo de estabelecimento da conexão segura.

Após o handshake, o prompt do cliente mudará para indicar que você está conectado e pode enviar dados. Você pode digitar texto e pressionar Enter. O servidor responderá, e você verá a resposta na tela. Para encerrar a conexão, digite Q e pressione Enter, ou use Ctrl+C.

Diagnóstico de Problemas Comuns

O `openssl s_client` é particularmente útil para identificar a causa de falhas em conexões TLS/SSL. Vejamos alguns cenários:

1. Certificado Inválido ou Autoassinado

Se um servidor usa um certificado autoassinado ou um certificado emitido por uma autoridade que não é confiável pelo seu sistema, o `openssl s_client` irá alertá-lo. A saída pode conter mensagens como:

verify error:num=18:self signed certificate
verify return code: 18 (self signed certificate)

Para desenvolvimento local, você pode instruir o `openssl s_client` a não verificar o certificado, embora isso nunca deva ser feito em produção:

openssl s_client -connect localhost:8443 -CAfile /path/to/your/selfsigned.crt

Ou, para ignorar completamente a verificação (use com extrema cautela):

openssl s_client -connect localhost:8443 -ign_eof -no_ssl3 -tls1_2 -servername myapp.local

Aviso de Segurança: Usar a opção -CAfile com um certificado autoassinado é aceitável para desenvolvimento local. Nunca use opções que ignorem completamente a verificação de certificados em ambientes de produção, pois isso compromete a segurança da comunicação.

2. Problemas de Negociação de Cipher Suite

Às vezes, o servidor e o cliente não conseguem concordar em um conjunto de cifras seguro para criptografar a comunicação. Isso pode ocorrer se o servidor suporta apenas protocolos ou cifras muito antigos e inseguros, ou se o cliente está configurado para usar apenas protocolos ou cifras modernos demais.

Você pode forçar o `openssl s_client` a usar versões específicas do TLS/SSL e conjuntos de cifras para testar a compatibilidade:

Para testar com TLSv1.2:

openssl s_client -connect example.com:443 -tls1_2

Para testar com TLSv1.3 (se suportado pela sua versão do OpenSSL):

openssl s_client -connect example.com:443 -tls1_3

Você também pode listar os ciphers disponíveis no seu cliente:

openssl ciphers -v

E especificar um conjunto de ciphers para a conexão:

openssl s_client -connect example.com:443 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'

3. Erros de SNI (Server Name Indication)

Em servidores que hospedam múltiplos sites com certificados SSL/TLS diferentes no mesmo endereço IP e porta (comum em hospedagem compartilhada ou em muitos servidores web modernos), o cliente precisa informar qual nome de host ele está tentando acessar. Isso é feito através do SNI.

Se o SNI não estiver configurado corretamente no lado do cliente ou do servidor, a conexão pode falhar. O `openssl s_client` suporta SNI através da opção -servername:

openssl s_client -connect myapp.com:443 -servername myapp.com

Se você estiver testando um serviço interno que usa um nome de host que não é resolúvel publicamente ou é diferente do hostname que o certificado foi emitido, o -servername é crucial.

Inspecionando Certificados em Detalhe

Além de testar a conexão, o `openssl s_client` é excelente para inspecionar certificados. A saída detalhada do handshake já fornece muitas informações, mas você pode querer extrair o certificado para análise posterior.

Para salvar o certificado do servidor em um arquivo:

openssl s_client -connect www.example.com:443 -showcerts < /dev/null > certificate.pem

O comando < /dev/null é usado para evitar que o `s_client` espere por entrada do usuário após a conexão. A opção -showcerts garante que a cadeia completa de certificados seja exibida e salva.

Uma vez que você tenha o arquivo certificate.pem, pode analisá-lo com outros comandos OpenSSL:

openssl x509 -in certificate.pem -text -noout

Este comando exibirá o certificado em formato legível, com detalhes sobre o sujeito, emissor, datas de validade, uso da chave, extensões (como Subject Alternative Names - SANs) e muito mais.

Considerações de Segurança e Boas Práticas

Embora o `openssl s_client` seja uma ferramenta de diagnóstico poderosa, é importante usá-lo com responsabilidade:

  • Nunca ignore a verificação de certificados em produção: A opção -CAfile com um certificado autoassinado é para desenvolvimento. Ignorar a verificação (por exemplo, com -connect example.com:443 -ign_eof sem especificar um CA) abre você para ataques man-in-the-middle.
  • Entenda as versões de protocolo: Certifique-se de que você e seu servidor suportam versões modernas e seguras do TLS (TLSv1.2 e TLSv1.3). Evite TLSv1.0 e TLSv1.1, que são considerados inseguros.
  • Verifique os ciphers suites: Use apenas ciphers suites fortes e modernos. Ferramentas como o SSL Labs' SSL Test (embora não seja um comando Linux) podem ajudar a avaliar a configuração do seu servidor.
  • Uso para APIs REST: Ao depurar APIs REST que usam HTTPS, o `openssl s_client` é excelente para isolar problemas de certificado ou handshake que podem estar impedindo seu cliente HTTP (como `curl` ou bibliotecas em linguagens de programação) de se conectar.

Conclusão

O `openssl s_client` é uma ferramenta essencial no arsenal de qualquer desenvolvedor ou administrador de sistemas que lida com aplicações web e serviços que dependem de conexões TLS/SSL seguras. Sua capacidade de fornecer visibilidade detalhada sobre o processo de handshake e a configuração de certificados o torna indispensável para diagnosticar e resolver uma ampla gama de problemas de conectividade segura. Ao dominar esta ferramenta, você estará mais bem equipado para garantir a robustez e a segurança das suas aplicações.

Foto de Tara Winstead no Pexels.