Hoja de referencia del comando OpenSSL

Comandos y casos de uso más comunes de OpenSSL

Cuando se trata de tareas relacionadas con la seguridad, como generar claves, CSR, certificados, calcular resúmenes, depurar conexiones TLS y otras tareas relacionadas con PKI y HTTPS, lo más probable es que termine utilizando la herramienta OpenSSL.

OpenSSL incluye toneladas de funciones que cubren una amplia gama de casos de uso, y es difícil recordar su sintaxis para todos ellos y es muy fácil perderse. manlas páginas no son tan útiles aquí, por lo que a menudo solo buscamos en Google "openssl cómo [usar caso aquí]" o buscamos algún tipo de "hoja de referencia de openssl" para recordar el uso de un comando y ver ejemplos.

Esta publicación es mi colección personal de opensslfragmentos de comandos y ejemplos, agrupados por caso de uso.

Casos de uso

Aquí hay una lista de casos de uso, que cubriré:

  1. Trabajar con claves RSA y ECDSA
  2. Crear solicitudes de firma de certificado (CSR)
  3. Crear certificados X.509
  4. Verificar CSR o certificados
  5. Calcular resúmenes de mensajes y codificación base64
  6. Cliente TLS para conectarse a un servidor remoto
  7. Mida la conexión TLS y el tiempo de negociación
  8. Convierta entre codificación (PEM, DER) y formatos de contenedor (PKCS12, PKCS7)
  9. Listar conjuntos de cifrados
  10. Verifique manualmente el estado de revocación del certificado desde el respondedor OCSP

Seguramente, esta no es una lista completa, pero cubre los casos de uso más comunes e incluye aquellos con los que he estado trabajando. Por ejemplo, omito el cifrado y descifrado, o uso openssl para la gestión de CA. openssles como un universo. Nunca se sabe dónde termina. ?

Trabajar con claves RSA y ECDSA

En los siguientes comandos, reemplácelo [bits]con el tamaño de la clave (por ejemplo, 2048, 4096, 8192).

Genere una clave RSA:

openssl genrsa -out example.key [bits]

Imprimir clave pública o módulo únicamente:

openssl rsa -in example.key -pubout

openssl rsa -in example.key -noout -modulus

Imprimir representación textual de la clave RSA:

openssl rsa -in example.key -text -noout

Genere una nueva clave RSA y cifre con una frase de contraseña basada en el cifrado AES CBC 256:

openssl genrsa -aes256 -out example.key [bits]

Verifique su clave privada. Si la clave tiene una frase de contraseña, se le pedirá:

openssl rsa -check -in example.key

Elimina la frase de contraseña de la clave:

openssl rsa -in example.key -out example.key

Cifre la clave privada existente con una frase de contraseña:

openssl rsa -des3 -in example.key -out example_with_pass.key

Genere la clave ECDSA. curveestá para ser reemplazado con: prime256v1, secp384r1, secp521r1, o cualquier otra curva elíptica apoyados:

openssl ecparam -genkey -name [curve] | openssl ec -out example.ec.key

Imprimir representación textual clave ECDSA:

openssl ec -in example.ec.key -text -noout

Enumere las curvas EC disponibles, que admite la biblioteca OpenSSL:

openssl ecparam -list_curves

Genere parámetros DH con una longitud determinada:

openssl dhparam -out dhparams.pem [bits]

Crear solicitudes de firma de certificado (CSR)

En los siguientes comandos, reemplace [digest]con el nombre de la función hash soportados: md5, sha1, sha224, sha256, sha384o sha512, etc. Es mejor evitar las funciones débiles como md5y sha1, y se adhieren a sha256y por encima.

Cree una CSR a partir de una clave privada existente.

openssl req -new -key example.key -out example.csr -[digest]

Cree una CSR y una clave privada sin una frase de contraseña en un solo comando:

openssl req -nodes -newkey rsa:[bits] -keyout example.key -out example.csr

Proporcione información sobre el tema de la RSE en una línea de comandos, en lugar de hacerlo mediante un indicador interactivo.

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"

Cree una CSR a partir del certificado existente y la clave privada:

openssl x509 -x509toreq -in cert.pem -out example.csr -signkey example.key

Genere una CSR para el certificado SAN multidominio proporcionando un archivo de configuración openssl:

openssl req -new -key example.key -out example.csr -config req.conf

donde req.conf:

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

Crear certificados X.509

Cree un certificado autofirmado y una nueva clave privada desde cero:

openssl req -nodes -newkey rsa:2048 -keyout example.key -out example.crt -x509 -days 365

Cree un certificado autofirmado utilizando CSR existente y clave privada:

openssl x509 -req -in example.csr -signkey example.key -out example.crt -days 365

Firme el certificado del niño usando su propio certificado "CA" y su clave privada. Si fuera una empresa de CA, esto muestra un ejemplo muy ingenuo de cómo podría emitir nuevos certificados.

openssl x509 -req -in child.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out child.crt

Imprimir representación textual del certificado

openssl x509 -in example.crt -text -noout

Imprima la huella digital del certificado como md5, sha1, sha256 digest:

openssl x509 -in cert.pem -fingerprint -sha256 -noout

Verificar CSR o certificados

Verifique una firma de CSR:

openssl req -in example.csr -verify

Verifique que la clave privada coincida con un certificado y 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

Verifique el certificado, siempre que tenga la raíz y cualquier certificado intermedio configurado como confiable en su máquina:

openssl verify example.crt

Verifique el certificado, cuando tenga una cadena de certificados intermedia. El certificado raíz no es parte del paquete y debe configurarse como confiable en su máquina.

openssl verify -untrusted intermediate-ca-chain.pem example.crt

Verifique el certificado, cuando tenga una cadena de certificados intermedios y un certificado raíz, que no esté configurado como confiable.

openssl verify -CAFile root.crt -untrusted intermediate-ca-chain.pem child.crt

Verifique que el certificado proporcionado por un servidor remoto cubra el nombre de host dado. Útil para verificar que su certificado de dominio múltiple cubra correctamente todos los nombres de host.

openssl s_client -verify_hostname www.example.com -connect example.com:443

Calcular resúmenes de mensajes y codificación base64

Calcular md5, sha1, sha256, sha384, sha512compendios:

openssl dgst -[hash_function] ile

cat input.file | openssl [hash_function]

Base64 encoding and decoding:

cat /dev/urandom | head -c 50 | openssl base64 | openssl base64 -d

TLS client to connect to a remote server

Connect to a server supporting TLS:

openssl s_client -connect example.com:443

openssl s_client -host example.com -port 443

Connect to a server and show full certificate chain:

openssl s_client -showcerts -host example.com -port 443 ull

Extract the certificate:

openssl s_client -connect example.com:443 2>&1 certificate.pem

Override SNI (Server Name Indication) extension with another server name. Useful for testing when multiple secure sites are hosted on same IP address:

openssl s_client -servername www.example.com -host example.com -port 443

Test TLS connection by forcibly using specific cipher suite, e.g. ECDHE-RSA-AES128-GCM-SHA256. Useful to check if a server can properly talk via different configured cipher suites, not one it prefers.

openssl s_client -host example.com -port 443 -cipher ECDHE-RSA-AES128-GCM-SHA256 2>&1 v/null

Measure TLS connection and handshake time

Measure SSL connection time without/with session reuse:

openssl s_time -connect example.com:443 -new

openssl s_time -connect example.com:443 -reuse

Roughly examine TCP and SSL handshake times using curl:

curl -kso /dev/null -w "tcp:%{time_connect}, ssldone:%{time_appconnect}\n" //example.com

Measure speed of various security algorithms:

openssl speed rsa2048

openssl speed ecdsap256

Convert between encoding and container formats

Convert certificate between DER and PEM formats:

openssl x509 -in example.pem -outform der -out example.der

openssl x509 -in example.der -inform der -out example.pem

Combine several certificates in PKCS7 (P7B) file:

openssl crl2pkcs7 -nocrl -certfile child.crt -certfile ca.crt -out example.p7b

Convert from PKCS7 back to PEM. If PKCS7 file has multiple certificates, the PEM file will contain all of the items in it.

openssl pkcs7 -in example.p7b -print_certs -out example.crt

Combine a PEM certificate file and a private key to PKCS#12 (.pfx .p12). Also, you can add a chain of certificates to PKCS12 file.

openssl pkcs12 -export -out certificate.pfx -inkey privkey.pem -in certificate.pem -certfile ca-chain.pem

Convert a PKCS#12 file (.pfx .p12) containing a private key and certificates back to PEM:

openssl pkcs12 -in keystore.pfx -out keystore.pem -nodes

List cipher suites

List available TLS cipher suites, openssl client is capable of:

openssl ciphers -v

Enumerate all individual cipher suites, which are described by a short-hand OpenSSL cipher list string. This is useful when you’re configuring server (like Nginx), and you need to test your ssl_ciphers string.

openssl ciphers -v 'EECDH+ECDSA+AESGCM:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4'

Manually check certificate revocation status from OCSP responder

This is a multi-step process:

  1. Retrieve the certificate from a remote server
  2. Obtain the intermediate CA certificate chain
  3. Read OCSP endpoint URI from the certificate
  4. Request a remote OCSP responder for certificate revocation status

First, retrieve the certificate from a remote server:

openssl s_client -connect example.com:443 2>&1 cert.pem

You’d also need to obtain intermediate CA certificate chain. Use -showcerts flag to show full certificate chain, and manually save all intermediate certificates to chain.pem file:

openssl s_client -showcerts -host example.com -port 443 ull

Read OCSP endpoint URI from the certificate:

openssl x509 -in cert.pem -noout -ocsp_uri

Request a remote OCSP responder for certificate revocation status using the URI from the above step (e.g. //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 //ocsp.stg-int-x1.letsencrypt.org

Resources

I’ve put together a few resources about OpenSSL that you may find useful.

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

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

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

Original text