Aide-mémoire de la commande OpenSSL

Commandes et cas d'utilisation OpenSSL les plus courants

En ce qui concerne les tâches liées à la sécurité, telles que la génération de clés, de CSR, de certificats, de calcul de résumés, de débogage des connexions TLS et d'autres tâches liées à PKI et HTTPS, vous finirez probablement par utiliser l'outil OpenSSL.

OpenSSL comprend des tonnes de fonctionnalités couvrant un large éventail de cas d'utilisation, et il est difficile de se souvenir de sa syntaxe pour tous et assez facile de se perdre. manles pages ne sont pas si utiles ici, si souvent nous utilisons simplement Google "openssl comment [cas d'utilisation ici]" ou cherchons une sorte de "feuille de triche openssl" pour rappeler l'utilisation d'une commande et voir des exemples.

Cet article est ma collection personnelle d' opensslextraits de commande et d'exemples, regroupés par cas d'utilisation.

Cas d'utilisation

Voici une liste de cas d'utilisation que je couvrirai:

  1. Utilisation des clés RSA et ECDSA
  2. Créer des demandes de signature de certificat (CSR)
  3. Créer des certificats X.509
  4. Vérifier les CSR ou les certificats
  5. Calculer les résumés de messages et l'encodage base64
  6. Client TLS pour se connecter à un serveur distant
  7. Mesurer la connexion TLS et le temps de prise de contact
  8. Conversion entre les formats d'encodage (PEM, DER) et de conteneur (PKCS12, PKCS7)
  9. Répertorier les suites de chiffrements
  10. Vérifier manuellement l'état de révocation des certificats à partir du répondeur OCSP

Ce n'est sûrement pas une liste complète, mais elle couvre les cas d'utilisation les plus courants et inclut ceux avec lesquels j'ai travaillé. Par exemple, j'ignore le chiffrement et le déchiffrement, ou j'utilise openssl pour la gestion de l'autorité de certification. opensslest comme un univers. On ne sait jamais où ça se termine. ?

Utilisation des clés RSA et ECDSA

Dans les commandes ci-dessous, remplacez [bits]par la taille de la clé (par exemple, 2048, 4096, 8192).

Générez une clé RSA:

openssl genrsa -out example.key [bits]

Imprimer la clé publique ou le module uniquement:

openssl rsa -in example.key -pubout

openssl rsa -in example.key -noout -modulus

Imprimer la représentation textuelle de la clé RSA:

openssl rsa -in example.key -text -noout

Générez une nouvelle clé RSA et chiffrez avec une phrase de passe basée sur le chiffrement AES CBC 256:

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

Vérifiez votre clé privée. Si la clé a une phrase de passe, vous serez invité à la saisir:

openssl rsa -check -in example.key

Supprimez la phrase secrète de la clé:

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

Cryptez la clé privée existante avec une phrase de passe:

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

Générez la clé ECDSA. curvedoit être remplacé par: prime256v1, secp384r1, secp521r1, ou toute autre courbe elliptique supporté:

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

Imprimer la représentation textuelle de la clé ECDSA:

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

Liste des courbes EC disponibles, prises en charge par la bibliothèque OpenSSL:

openssl ecparam -list_curves

Générer des paramètres DH avec une longueur donnée:

openssl dhparam -out dhparams.pem [bits]

Créer des demandes de signature de certificat (CSR)

Dans les commandes ci - dessous, remplacez [digest]le nom de la fonction de hachage pris en charge: md5, sha1, sha224, sha256, sha384ou sha512, etc. Il est préférable d'éviter les fonctions faibles comme md5et sha1, et de s'y tenir sha256et au- dessus.

Créez une CSR à partir de la clé privée existante.

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

Créez une CSR et une clé privée sans phrase de passe dans une seule commande:

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

Fournissez des informations sur le sujet CSR sur une ligne de commande, plutôt que via une invite interactive.

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"

Créez une CSR à partir d'un certificat et d'une clé privée existants:

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

Générez un CSR pour un certificat SAN multi-domaine en fournissant un fichier de configuration openssl:

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

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

Créer des certificats X.509

Créez un certificat auto-signé et une nouvelle clé privée à partir de zéro:

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

Créez un certificat auto-signé à l'aide de la CSR et de la clé privée existantes:

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

Signez le certificat enfant en utilisant votre propre certificat «CA» et sa clé privée. Si vous étiez une société CA, cela montre un exemple très naïf de la façon dont vous pourriez émettre de nouveaux certificats.

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

Imprimer la représentation textuelle du certificat

openssl x509 -in example.crt -text -noout

Imprimer l'empreinte digitale du certificat sous la forme de résumé md5, sha1, sha256:

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

Vérifier les CSR ou les certificats

Vérifiez une signature CSR:

openssl req -in example.csr -verify

Vérifiez que la clé privée correspond à un certificat et à une 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

Vérifiez le certificat, à condition que la racine et tous les certificats intermédiaires soient configurés comme approuvés sur votre ordinateur:

openssl verify example.crt

Vérifiez le certificat, lorsque vous avez une chaîne de certificats intermédiaire. Le certificat racine ne fait pas partie du bundle et doit être configuré comme approuvé sur votre ordinateur.

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

Vérifiez le certificat, lorsque vous avez une chaîne de certificat intermédiaire et un certificat racine, qui n'est pas configuré en tant que certificat approuvé.

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

Vérifiez que le certificat servi par un serveur distant couvre le nom d'hôte donné. Utile pour vérifier que votre certificat mutlidomain couvre correctement tous les noms d'hôtes.

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

Calculer les résumés de messages et l'encodage base64

Calculer md5, sha1, sha256, sha384, sha512digests:

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