Artigo original: OpenSSL command cheatsheet

Quando se trata de tarefas relacionadas à segurança, como gerar chaves, CSRs, certificados, calcular resumos (digests), depurar conexões TLS e outras tarefas relacionadas a PKI e HTTPS, você provavelmente acabaria usando a ferramenta OpenSSL.

O OpenSSL inclui milhares de recursos que cobrem uma ampla variedade de casos de uso, sendo difícil lembrar de sua sintaxe para todos eles e muito fácil de se perder. As páginas man não são tão úteis aqui. Muitas vezes, apenas procuramos no Google "openssl how to [caso de uso aqui]" ou procuramos algum tipo de "openssl cheatsheet" para relembrar o uso de um comando e ver exemplos.

Este artigo é minha coleção pessoal de trechos e exemplos de comandos do OpenSSL, agrupados por caso de uso.

Casos de uso

Aqui está a lista dos casos de uso dos quais eu vou tratar:

  1. Trabalhando com chaves RSA e ECDSA
  2. Criar solicitações de assinatura de certificados (CSR)
  3. Criar certificados X.509
  4. Verificar CSRs ou certificados
  5. Calcular resumos de mensagens e codificação base64
  6. Cliente TLS para conectar a um servidor remoto
  7. Medir o tempo da conexão TLS e da negociação
  8. Conversão entre formatos de codificação (PEM, DER) e recipientes (PKCS12, PKCS7)
  9. Listar conjuntos de cifras
  10. Verificar manualmente o estado de revogação de certificados a partir do respondedor OCSP

Certamente, esta não é uma lista completa, mas abrange os casos de uso mais comuns e inclui aqueles com os quais tenho trabalhado. Por exemplo, eu pulo a criptografia e a descriptografia ou uso openssl para gerenciamento de CA. O openssl é como um universo. Você nunca sabe onde termina.

Trabalhando com chaves RSA e ECDSA

Nos comandos abaixo, substitua [bits] com o tamanho da chave (Por exemplo, 2048, 4096, 8192).

Gerar uma chave RSA:
openssl genrsa -out example.key [bits]

Exibir apenas a chave pública ou modulus:
openssl rsa -in example.key -pubout
openssl rsa -in example.key -noout -modulus

Exibir a representação textual da chave RSA:
openssl rsa -in example.key -text -noout

Gerar uma nova chave RSA e criptografá-la com uma senha baseada na criptografia AES CBC 256:
openssl genrsa -aes256 -out example.key [bits]

Verificar sua chave privada. Se a chave tem uma senha, você será solicitado a informá-la:
openssl rsa -check -in example.key

Remover a senha da chave:
openssl rsa -in example.key -out example.key

Criptografar a chave privada com a senha:
openssl rsa -des3 -in example.key -out example_with_pass.key

Gerar a chave ECDSA. curve deve ser substituído por: prime256v1, secp384r1, secp521r1 ou outra curva elíptica suportada:
openssl ecparam -genkey -name [curve] | openssl ec -out example.ec.key

Exibir a representação textual da chave ECDSA:
openssl ec -in example.ec.key -text -noout

Listar as curvas EC disponíveis às quais a biblioteca OpenSSL oferece suporte:
openssl ecparam -list_curves

Gerar os parâmetros de DH com um comprimento dado:
openssl dhparam -out dhparams.pem [bits]

Criar solicitações de assinatura de certificados (CSR)

Nos comandos abaixo, substitua [digest] com o nome da função de hash suportada: md5, sha1, sha224, sha256, sha384 ou sha512 etc. É melhor evitar funções fracas, como md5 e sha1, e se ater a sha256 ou superior.

Criar uma CSR a partir da chave privada.
openssl req -new -key example.key -out example.csr -[digest]

Criar uma CSR e uma chave privada sem uma senha em um único comando:
openssl req -nodes -newkey rsa:[bits] -keyout example.key -out example.csr

Fornecer informações do assunto da CSR em uma linha de comando, em vez de um prompt interativo.
openssl req -nodes -newkey rsa:[bits] -keyout example.key -out example.csr -subj "/C=UA/ST=Kharkov/L=Kharkov/O=Super Secure Company/OU=IT Department/CN=example.com"

Criar uma CSR a partir do certificado e chave privada existentes:
openssl x509 -x509toreq -in cert.pem -out example.csr -signkey example.key

Gerar uma CSR para certificado SAN multidomínio fornecendo um arquivo de configuração openssl:
openssl req -new -key example.key -out example.csr -config req.conf

sendo req.conf:

[req]prompt=nodefault_md = sha256distinguished_name = dnreq_extensions = req_ext
[dn]CN=example.com
[req_ext]subjectAltName=@alt_names
[alt_names]DNS.1=example.comDNS.2=www.example.comDNS.3=ftp.example.com

Criar certificados X.509

Criar um certificado autoassinado e nova chave privada do zero:
openssl req -nodes -newkey rsa:2048 -keyout example.key -out example.crt -x509 -days 365

Criar um certificado autoassinado usando CSR e chave privada existentes:
openssl x509 -req -in example.csr -signkey example.key -out example.crt -days 365

Assinar certificado filho usando o certificado de sua autoridade certificadora ou AC ("CA", em inglês) e sua chave privada. Se você fosse uma AC, este é um exemplo bem básico de como você poderia emitir novos certificados.
openssl x509 -req -in child.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out child.crt

Exibir a representação textual do certificado
openssl x509 -in example.crt -text -noout

Exibir a impressão digital (fingerprint) do certificado como resumo md5, sha1, sha256:
openssl x509 -in cert.pem -fingerprint -sha256 -noout

Verificar CSRs ou certificados

Verificar uma assinatura de CSR:
openssl req -in example.csr -verify

Verificar se a chave privada corresponde a um certificado e uma CSR:
openssl rsa -noout -modulus -in example.key | openssl sha256
openssl x509 -noout -modulus -in example.crt | openssl sha256
openssl req -noout -modulus -in example.csr | openssl sha256

Verificar o certificado, presumindo que você tenha o certificado raiz e quaisquer outros intermediários configurados como confiáveis em sua máquina:
openssl verify example.crt

Verificar o certificado, quando você tem a cadeia de certificação intermediária. O certificado raiz não é parte do pacote, devendo ser configurado como um confiável em sua máquina.
openssl verify -untrusted intermediate-ca-chain.pem example.crt

Verificar o certificado, quando você tem a cadeia de certificação intermediária e o certificado raiz, o qual não está configurado como confiável.
openssl verify -CAFile root.crt -untrusted intermediate-ca-chain.pem child.crt

Verificar se o certificado servido por um servidor remoto cobre o nome de máquina dado. Isso é útil para verificar se seu certificado multidomínio cobre adequadamente todos os nomes de máquina.
openssl s_client -verify_hostname www.example.com -connect example.com:443

Calcular resumos de mensagens e codificação base64

Calcular resumos md5, sha1, sha256, sha384, sha512:
openssl dgst -[hash_function] <input.file>
cat input.file | openssl [hash_function]

Codificação e decodificação de Base64:
cat /dev/urandom | head -c 50 | openssl base64 | openssl base64 -d

Cliente TLS para conectar a um servidor remoto

Conectar a um servidor que ofereça suporte a TLS:
openssl s_client -connect example.com:443
openssl s_client -host example.com -port 443

Conectar a um servidor e mostrar a cadeia de certificação completa:
openssl s_client -showcerts -host example.com -port 443 </dev/null

Extrair o certificado:
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificate.pem

Substituir  a extensão SNI (Indicação de Nome do Servidor ou Server Name Indication, em inglês) com outro nome de servidor. Isso é útil para testar quando vários sites seguros estão hospedados no mesmo endereço IP:
openssl s_client -servername www.example.com -host example.com -port 443

Testar a conexão TLS usando de forma forçada um conjunto específico de cifras como, por exemplo, ECDHE-RSA-AES128-GCM-SHA256. Isso é útil para verificar se um servidor pode conversar adequadamente por meio de conjuntos de cifras configurados diferentes, em vez daqueles que ele prefere.
openssl s_client -host example.com -port 443 -cipher ECDHE-RSA-AES128-GCM-SHA256 2>&1 </dev/null

Medir o tempo da conexão TLS e da negociação

Medir o tempo de conexão SSL sem/com reuso de sessão:
openssl s_time -connect example.com:443 -new
openssl s_time -connect example.com:443 -reuse

Examinar aproximadamente os tempos de handshake TCP e SSL usando o curl:
curl -kso /dev/null -w "tcp:%{time_connect}, ssldone:%{time_appconnect}\n" https://example.com

Medir a velocidade de vários algoritmos de segurança:
openssl speed rsa2048
openssl speed ecdsap256

Conversão entre formatos de codificação (PEM, DER) e recipientes

Converter um certificado entre formatos DER e PEM:
openssl x509 -in example.pem -outform der -out example.der
openssl x509 -in example.der -inform der -out example.pem

Combinar vários certificados em um arquivo PKCS7 (P7B):
openssl crl2pkcs7 -nocrl -certfile child.crt -certfile ca.crt -out example.p7b

Converter do PKCS7 de volta para PEM. Se o arquivo PKCS7 tiver vários certificados, o arquivo PEM vai conter todos os itens nele.
openssl pkcs7 -in example.p7b -print_certs -out example.crt

Combinar um arquivo de certificado PEM e uma chave privada no PKCS#12 (.pfx .p12). Você também pode adicionar uma cadeia de certificados ao arquivo PKCS12.
openssl pkcs12 -export -out certificate.pfx -inkey privkey.pem -in certificate.pem -certfile ca-chain.pem

Converter um arquivo PKCS#12 (.pfx .p12) contendo uma chave privada e certificados de volta no PEM:
openssl pkcs12 -in keystore.pfx -out keystore.pem -nodes

Listar conjuntos de cifras

Listar os conjuntos de cifras TLS disponíveis aos quais o cliente openssl oferece suporte:
openssl ciphers -v

Enumerar todos os conjuntos de cifras individuais, que são descritos por uma string de lista de cifras OpenSSL abreviada. Isso é útil quando você está configurando o servidor (como o Nginx) e precisa testar sua string ssl_ciphers.
openssl ciphers -v 'EECDH+ECDSA+AESGCM:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4'

Verificar manualmente o estado de revogação de certificados a partir do respondedor OCSP

Este é um processo com vários passos:

  1. Obter o certificado de um servidor remoto
  2. Obter a cadeia de certificação AC intermediária
  3. Ler o URI do endpoint OCSP do certificado
  4. Solicitar a um respondedor OCSP remoto que informe o estado de revogação do certificado

Primeiramente, obtenha o certificado de um servidor remoto:
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > cert.pem

Você também precisa obter a cadeia de certificação AC intermediária. Use o sinalizador -showcerts para mostrar a cadeia de certificação completa e salvar manualmente todos os certificados intermediárias no arquivo chain.pem:
openssl s_client -showcerts -host example.com -port 443 </dev/null

Leia o URI do endpoint OCSP a partir do certificado:
openssl x509 -in cert.pem -noout -ocsp_uri

Solicite um respondedor OCSP remoto para o estado de revogação do certificado usando o URI da etapa acima (por exemplo, http://ocsp.stg-int-x1.letsencrypt.org).
openssl ocsp -header "Host" "ocsp.stg-int-x1.letsencrypt.org" -issuer chain.pem -VAfile chain.pem -cert cert.pem -text -url http://ocsp.stg-int-x1.letsencrypt.org

Recursos

Reuni alguns recursos sobre OpenSSL que você pode achar úteis (em inglês).

OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs | DigitalOcean — https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs

The Most Common OpenSSL Commands — https://www.sslshopper.com/article-most-common-openssl-commands.html

OpenSSL: Working with SSL Certificates, Private Keys and CSRs — https://www.dynacont.net/documentation/linux/openssl/