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:
- Trabalhando com chaves RSA e ECDSA
- Criar solicitações de assinatura de certificados (CSR)
- Criar certificados X.509
- Verificar CSRs ou certificados
- Calcular resumos de mensagens e codificação base64
- Cliente TLS para conectar a um servidor remoto
- Medir o tempo da conexão TLS e da negociação
- Conversão entre formatos de codificação (PEM, DER) e recipientes (PKCS12, PKCS7)
- Listar conjuntos de cifras
- 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 certificadoopenssl 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:
- Obter o certificado de um servidor remoto
- Obter a cadeia de certificação AC intermediária
- Ler o URI do endpoint OCSP do certificado
- 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/