OpenSSL Befehl Cheatsheet

Die häufigsten OpenSSL-Befehle und Anwendungsfälle

Wenn es um sicherheitsrelevante Aufgaben wie das Generieren von Schlüsseln, CSRs, Zertifikaten, das Berechnen von Digests, das Debuggen von TLS-Verbindungen und andere Aufgaben im Zusammenhang mit PKI und HTTPS geht, werden Sie höchstwahrscheinlich das OpenSSL-Tool verwenden.

OpenSSL enthält unzählige Funktionen, die eine breite Palette von Anwendungsfällen abdecken, und es ist schwierig, sich die Syntax für alle zu merken, und es ist ziemlich leicht, sich zu verlaufen. manSeiten sind hier nicht so hilfreich, so oft verwenden wir nur Google "openssl how to [use case here]" oder suchen nach einer Art "openssl cheatsheet", um die Verwendung eines Befehls abzurufen und Beispiele zu sehen.

Dieser Beitrag ist meine persönliche Sammlung von opensslBefehlsausschnitten und Beispielen, gruppiert nach Anwendungsfällen.

Anwendungsfälle

Hier ist eine Liste von Anwendungsfällen, die ich behandeln werde:

  1. Arbeiten mit RSA- und ECDSA-Schlüsseln
  2. Erstellen Sie Zertifikatsignierungsanforderungen (CSR).
  3. Erstellen Sie X.509-Zertifikate
  4. Überprüfen Sie CSRs oder Zertifikate
  5. Berechnen Sie Message Digests und Base64-Codierung
  6. TLS-Client zum Herstellen einer Verbindung zu einem Remote-Server
  7. Messen Sie die TLS-Verbindung und die Handshake-Zeit
  8. Konvertieren zwischen Codierungs- (PEM, DER) und Containerformaten (PKCS12, PKCS7)
  9. Listen Sie Chiffrensuiten auf
  10. Überprüfen Sie den Status der Zertifikatsperrung manuell vom OCSP-Responder

Dies ist sicherlich keine vollständige Liste, aber sie deckt die häufigsten Anwendungsfälle ab und schließt diejenigen ein, mit denen ich gearbeitet habe. Zum Beispiel überspringe ich die Ver- und Entschlüsselung oder verwende openssl für die CA-Verwaltung. opensslist wie ein Universum. Man weiß nie, wo es endet. ?

Arbeiten mit RSA- und ECDSA-Schlüsseln

Ersetzen Sie in den folgenden Befehlen durch [bits]die Schlüsselgröße (z. B. 2048, 4096, 8192).

Generieren Sie einen RSA-Schlüssel:

openssl genrsa -out example.key [bits]

Nur öffentlichen Schlüssel oder Modul drucken:

openssl rsa -in example.key -pubout

openssl rsa -in example.key -noout -modulus

Textdarstellung des RSA-Schlüssels drucken:

openssl rsa -in example.key -text -noout

Generieren Sie einen neuen RSA-Schlüssel und verschlüsseln Sie ihn mit einer Passphrase, die auf der AES CBC 256-Verschlüsselung basiert:

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

Überprüfen Sie Ihren privaten Schlüssel. Wenn der Schlüssel eine Passphrase enthält, werden Sie dazu aufgefordert:

openssl rsa -check -in example.key

Entfernen Sie die Passphrase vom Schlüssel:

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

Verschlüsseln Sie den vorhandenen privaten Schlüssel mit einer Passphrase:

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

Generieren Sie den ECDSA-Schlüssel. curvewird mit ersetze: prime256v1, secp384r1, secp521r1, oder jeder anderen elliptischen Kurve unterstützt:

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

Textdarstellung des ECDSA-Schlüssels drucken:

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

Listen Sie die verfügbaren EC-Kurven auf, die von der OpenSSL-Bibliothek unterstützt werden:

openssl ecparam -list_curves

Generieren Sie DH-Parameter mit einer bestimmten Länge:

openssl dhparam -out dhparams.pem [bits]

Erstellen Sie Zertifikatsignierungsanforderungen (CSR).

In den folgenden Befehlen werden ersetzt [digest]mit dem Namen der unterstützten Hash - Funktion: md5, sha1, sha224, sha256, sha384oder sha512, usw. Es ist besser , schwache Funktionen wie zu vermeiden , md5und sha1, und dabei zu bleiben sha256und darüber.

Erstellen Sie eine CSR aus dem vorhandenen privaten Schlüssel.

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

Erstellen Sie einen CSR und einen privaten Schlüssel ohne Passphrase in einem einzigen Befehl:

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

Geben Sie CSR-Betreffinformationen über eine Befehlszeile und nicht über eine interaktive Eingabeaufforderung an.

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"

Erstellen Sie eine CSR aus vorhandenem Zertifikat und privatem Schlüssel:

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

Generieren Sie eine CSR für ein SAN-Zertifikat mit mehreren Domänen, indem Sie eine openssl-Konfigurationsdatei bereitstellen:

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

wo 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

Erstellen Sie X.509-Zertifikate

Erstellen Sie ein selbstsigniertes Zertifikat und einen neuen privaten Schlüssel von Grund auf neu:

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

Erstellen Sie ein selbstsigniertes Zertifikat mit vorhandenem CSR und privatem Schlüssel:

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

Signieren Sie das untergeordnete Zertifikat mit Ihrem eigenen CA-Zertifikat und seinem privaten Schlüssel. Wenn Sie ein CA-Unternehmen waren, zeigt dies ein sehr naives Beispiel dafür, wie Sie neue Zertifikate ausstellen können.

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

Textdarstellung des Zertifikats drucken

openssl x509 -in example.crt -text -noout

Fingerabdruck des Druckzertifikats als md5, sha1, sha256 Digest:

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

Überprüfen Sie CSRs oder Zertifikate

Überprüfen Sie eine CSR-Signatur:

openssl req -in example.csr -verify

Stellen Sie sicher, dass der private Schlüssel mit einem Zertifikat und CSR übereinstimmt:

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

Überprüfen Sie das Zertifikat, vorausgesetzt, Sie haben Root- und alle Zwischenzertifikate, die auf Ihrem Computer als vertrauenswürdig konfiguriert sind:

openssl verify example.crt

Überprüfen Sie das Zertifikat, wenn Sie über eine Zwischenzertifikatskette verfügen. Das Stammzertifikat ist nicht Teil des Bundles und sollte auf Ihrem Computer als vertrauenswürdig konfiguriert werden.

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

Überprüfen Sie das Zertifikat, wenn Sie über eine Zwischenzertifikatskette und ein Stammzertifikat verfügen, die nicht als vertrauenswürdig konfiguriert sind.

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

Stellen Sie sicher, dass das von einem Remoteserver bereitgestellte Zertifikat den angegebenen Hostnamen abdeckt. Nützlich, um zu überprüfen, ob Ihr Mutlidomain-Zertifikat alle Hostnamen ordnungsgemäß abdeckt.

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

Berechnen Sie Message Digests und Base64-Codierung

Berechnen Sie md5, sha1, sha256, sha384, sha512verdaut:

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