Comando openssl: Certificados, Hashing e Criptografia

Comando openssl: Certificados, Hashing e Criptografia

O Que Você Vai Aprender

  • Como criar certificados autoassinados e CSRs com openssl
  • Como calcular hashes SHA-256 e executar criptografia AES instantaneamente
  • Como verificar a validade do certificado de um servidor público em uma linha

Resumo Rápido (os 5 que você realmente usará)

  • Versão --> openssl version
  • Hash --> openssl dgst -sha256 file
  • Certificado --> openssl req -x509 -newkey rsa:2048 ...
  • Inspecionar cert --> openssl s_client -connect host:443
  • Criptografar --> openssl enc -aes-256-cbc -pbkdf2 ...

Premissas (ambiente alvo)

  • SO: Ubuntu / Linux em geral
  • OpenSSL 1.1.1 ou posterior (verifique com openssl version)
  • Em versões antigas 1.0.x, -pbkdf2 não está disponível

O que é o comando openssl?

Conclusão: openssl é uma ferramenta CLI multifuncional para TLS/SSL e criptografia, lidando com certificados, hashes, criptografia e geração aleatória através de subcomandos.

openssl é a interface para a biblioteca OpenSSL e funciona através de subcomandos: openssl <subcomando> <opcoes>.

$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

Os principais subcomandos:

Subcomando Função
dgst Calcular hashes
enc Criptografia simétrica
genpkey Gerar chaves privadas
req CSR / certificado autoassinado
x509 Exibir/converter certificados
s_client Debug de conexão TLS
rand Geração aleatória

Como calcular um hash?

Conclusão: openssl dgst -sha256 file calcula o SHA-256 de um arquivo, útil para detecção de adulteração e verificação de integridade de downloads.

Hash de um arquivo

$ openssl dgst -sha256 ubuntu.iso
SHA256(ubuntu.iso)= 9bc6b8f6...(64 digitos hexadecimais)

Troque sha256 por sha1 ou sha512 para obter outros digests.

Hash de uma string

$ echo -n "hello" | openssl dgst -sha256

Sem -n, echo adiciona uma quebra de linha final que se torna parte dos dados hasheados e altera o resultado. Sempre use -n para hashing de strings.

Como criar um certificado?

Conclusão: Para desenvolvimento, openssl req -x509 cria uma chave privada e um certificado autoassinado de uma vez; para produção, crie um CSR e faça uma CA assiná-lo.

Certificado autoassinado (desenvolvimento/testes)

$ openssl req -x509 -newkey rsa:2048 \
    -keyout key.pem -out cert.pem \
    -days 365 -nodes \
    -subj "/CN=localhost"

O que as opções significam:

  • -x509: gera um certificado autoassinado em vez de um CSR
  • -newkey rsa:2048: gera uma nova chave RSA de 2048 bits
  • -keyout / -out: caminhos de saída para a chave / certificado
  • -days 365: período de validade
  • -nodes: armazena a chave privada sem frase secreta ("no DES")
  • -subj: define o Subject de forma não interativa

-nodes remove a proteção por frase secreta. Sempre restrinja o arquivo da chave com chmod 600 key.pem para que somente o proprietário possa lê-lo.

Para produção: criar um CSR

Para que uma CA assine seu certificado, crie uma chave privada e um CSR (Certificate Signing Request).

$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out key.pem
$ openssl req -new -key key.pem -out request.csr -subj "/CN=example.com"

Inspecione o CSR gerado com:

$ openssl req -in request.csr -noout -text

Como verificar a validade do certificado de um servidor?

Conclusão: Conecte com openssl s_client e encaminhe para x509 -noout -dates para obter o período de validade em uma única linha.

Inspecionar um certificado local

$ openssl x509 -in cert.pem -noout -text

Para apenas as datas de validade, use -dates:

$ openssl x509 -in cert.pem -noout -dates
notBefore=Jun  5 00:00:00 2026 GMT
notAfter=Jun  5 00:00:00 2027 GMT

Inspecionar o certificado de um servidor público

$ echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
    | openssl x509 -noout -dates

-servername define o SNI (Server Name Indication). Em hosts que servem múltiplos domínios a partir de um único IP, omiti-lo retorna um certificado diferente.

Como criptografar um arquivo?

Conclusão: openssl enc -aes-256-cbc -pbkdf2 faz criptografia simétrica baseada em senha; para descriptografar, adicione -d às mesmas opções.

Criptografar

$ openssl enc -aes-256-cbc -pbkdf2 -salt -in secret.txt -out secret.enc

Será solicitada uma senha. O que as opções significam:

  • -aes-256-cbc: AES-256 no modo CBC
  • -pbkdf2: usa derivação de chave PBKDF2 (efetivamente obrigatório)
  • -salt: adiciona um salt (ativado por padrão; declarado explicitamente aqui)

Descriptografar

$ openssl enc -aes-256-cbc -pbkdf2 -d -in secret.enc -out secret.txt

Como gerar senhas ou chaves fortes?

Conclusão: openssl rand gera dados aleatórios criptograficamente seguros: -base64 para senhas, -hex para tokens.

$ openssl rand -base64 24
Xa9b2C... (~32 caracteres de string aleatoria)
$ openssl rand -hex 32

Isso produz um token hexadecimal de 64 dígitos, útil para chaves de API e segredos de sessão.

Resumo: Templates para Copiar e Colar

Conclusão: Mantenha esses one-liners de openssl baseados em tarefas à mão para executar trabalhos com certificados, hashing e criptografia sem hesitação.

Templates openssl para copiar e colar

# Mostrar versao
openssl version

# Hash SHA-256
openssl dgst -sha256 file

# Certificado autoassinado (dev, 1 ano)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"

# Validade do certificado de servidor publico
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

# Criptografar / descriptografar com AES-256
openssl enc -aes-256-cbc -pbkdf2 -salt -in in.txt -out out.enc
openssl enc -aes-256-cbc -pbkdf2 -d -in out.enc -out in.txt

# Gerar uma senha forte
openssl rand -base64 24

O que não fazer

  • Usar enc sem -pbkdf2 (derivação de chave fraca)
  • Deixar uma chave privada desprotegida sem chmod 600
  • Deixar uma chave com -nodes em um servidor de produção

Próximas Leituras