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. man
les 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' openssl
extraits de commande et d'exemples, regroupés par cas d'utilisation.
Cas d'utilisation
Voici une liste de cas d'utilisation que je couvrirai:
- Utilisation des clés RSA et ECDSA
- Créer des demandes de signature de certificat (CSR)
- Créer des certificats X.509
- Vérifier les CSR ou les certificats
- Calculer les résumés de messages et l'encodage base64
- Client TLS pour se connecter à un serveur distant
- Mesurer la connexion TLS et le temps de prise de contact
- Conversion entre les formats d'encodage (PEM, DER) et de conteneur (PKCS12, PKCS7)
- Répertorier les suites de chiffrements
- 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. openssl
est 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. curve
doit ê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
, sha384
ou sha512
, etc. Il est préférable d'éviter les fonctions faibles comme md5
et sha1
, et de s'y tenir sha256
et 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
où 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
, sha512
digests:
openssl dgst -[hash_function]
le
cat input.file | openssl [hash_functi
on]
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 certif
icate.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 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 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 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
Manually check certificate revocation status from OCSP responder
This is a multi-step process:
Retrieve the certificate from a remote server
Obtain the intermediate CA certificate chain
Read OCSP endpoint URI from the certificate
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
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