Comando openssl: Certificados, Hashing e Criptografia

Comando openssl: Certificados, Hashing e Criptografia

O Que Voce 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 publico em uma linha

Resumo Rapido (os 5 que voce realmente usara)

  • Versao --> 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 versoes antigas 1.0.x, -pbkdf2 nao esta disponivel

O que e o comando openssl?

Conclusao: openssl e uma ferramenta CLI multifuncional para TLS/SSL e criptografia, lidando com certificados, hashes, criptografia e geracao aleatoria atraves de subcomandos.

openssl e a interface para a biblioteca OpenSSL e funciona atraves 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 Funcao
dgst Calcular hashes
enc Criptografia simetrica
genpkey Gerar chaves privadas
req CSR / certificado autoassinado
x509 Exibir/converter certificados
s_client Debug de conexao TLS
rand Geracao aleatoria

Como calcular um hash?

Conclusao: openssl dgst -sha256 file calcula o SHA-256 de um arquivo, util para deteccao de adulteracao e verificacao 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?

Conclusao: Para desenvolvimento, openssl req -x509 cria uma chave privada e um certificado autoassinado de uma vez; para producao, crie um CSR e faca uma CA assina-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 opcoes 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 saida para a chave / certificado
  • -days 365: periodo de validade
  • -nodes: armazena a chave privada sem frase secreta ("no DES")
  • -subj: define o Subject de forma nao interativa

-nodes remove a protecao por frase secreta. Sempre restrinja o arquivo da chave com chmod 600 key.pem para que somente o proprietario possa le-lo.

Para producao: 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?

Conclusao: Conecte com openssl s_client e encaminhe para x509 -noout -dates para obter o periodo de validade em uma unica 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 publico

$ 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 multiplos dominios a partir de um unico IP, omiti-lo retorna um certificado diferente.

Como criptografar um arquivo?

Conclusao: openssl enc -aes-256-cbc -pbkdf2 faz criptografia simetrica baseada em senha; para descriptografar, adicione -d as mesmas opcoes.

Criptografar

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

Sera solicitada uma senha. O que as opcoes significam:

  • -aes-256-cbc: AES-256 no modo CBC
  • -pbkdf2: usa derivacao de chave PBKDF2 (efetivamente obrigatorio)
  • -salt: adiciona um salt (ativado por padrao; declarado explicitamente aqui)

Descriptografar

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

Como gerar senhas ou chaves fortes?

Conclusao: openssl rand gera dados aleatorios 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 digitos, util para chaves de API e segredos de sessao.

Resumo: Templates para Copiar e Colar

Conclusao: Mantenha esses one-liners de openssl baseados em tarefas a mao para executar trabalhos com certificados, hashing e criptografia sem hesitacao.

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 nao fazer

  • Usar enc sem -pbkdf2 (derivacao de chave fraca)
  • Deixar uma chave privada desprotegida sem chmod 600
  • Deixar uma chave com -nodes em um servidor de producao

Proximas Leituras