OpenSSL Essentials: Arbeiten mit SSL-Zertifikaten, privaten Schlüsseln und CSR

Einführung

OpenSSL ist ein vielseitiges Befehlszeilenwerkzeug, das für eine Vielzahl von Aufgaben im Zusammenhang mit der Public-Key-Infrastruktur (PKI) und HTTPS (HTTP über TLS) verwendet werden kann. Diese Spickzettel-Artige Anleitung bietet eine schnelle Referenz für OpenSSL-Befehle, die in üblichen, alltäglichen Szenarien nützlich sind. Dies umfasst OpenSSL-Beispiele zum Generieren von privaten Schlüsseln, Zertifikatsanforderungen und Konvertierung von Zertifikatsformaten. Es deckt nicht alle Verwendungen von OpenSSL ab.

So verwenden Sie diesen Leitfaden:

  • Wenn Sie mit Zertifikatsanforderungen (CSRs) nicht vertraut sind, lesen Sie den ersten Abschnitt
  • Abgesehen vom ersten Abschnitt ist dieser Leitfaden im Spickzettel-Format: eine Liste von eigenständigen Befehlszeilen-Schnipseln
  • Springen Sie zu jedem Abschnitt, der für die Aufgabe relevant ist, die Sie abschließen möchten (Hinweis: Verwenden Sie das Inhaltsverzeichnis oder die Suchfunktion Ihres Browsers)
  • Die meisten Befehle sind Einzeiler, die aus Gründen der Klarheit auf mehrere Zeilen erweitert wurden (unter Verwendung des Symbols \)

Über Zertifikatsanforderungen (CSRs)

Wenn Sie ein SSL-Zertifikat von einer kommerziellen Zertifizierungsstelle (CA) erhalten möchten, müssen Sie eine Zertifikatanforderung (CSR) generieren. Ein CSR besteht hauptsächlich aus dem öffentlichen Schlüssel eines Schlüsselpaares und einigen zusätzlichen Informationen. Beide Komponenten werden in das Zertifikat eingefügt, wenn es signiert wird.

Immer wenn Sie einen CSR generieren, werden Sie aufgefordert, Informationen zum Zertifikat bereitzustellen. Diese Informationen werden als Distinguished Name (DN) bezeichnet. Ein wichtiger Feld im DN ist der Common Name (CN), der genau der vollständig qualifizierte Domainname (FQDN) des Hosts sein sollte, den Sie mit dem Zertifikat verwenden möchten. Es ist auch möglich, die interaktiven Abfragen beim Erstellen eines CSR zu überspringen, indem Sie die Informationen über die Befehlszeile oder aus einer Datei übergeben.

Die anderen Elemente in einem DN liefern zusätzliche Informationen über Ihr Unternehmen oder Ihre Organisation. Wenn Sie ein SSL-Zertifikat von einer Zertifizierungsstelle erwerben, ist es oft erforderlich, dass diese zusätzlichen Felder, wie „Organisation“, die Details Ihrer Organisation genau wiedergeben.

Hier ist ein Beispiel dafür, wie die Eingabeaufforderung für CSR-Informationen aussehen wird:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

Wenn Sie die Eingabeaufforderung für CSR-Informationen nicht interaktiv beantworten möchten, können Sie dies tun, indem Sie die Option -subj zu allen OpenSSL-Befehlen hinzufügen, die CSR-Informationen anfordern. Hier ist ein Beispiel für die Option, unter Verwendung derselben Informationen, die im obigen Codeblock angezeigt werden:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Jetzt, da Sie CSR verstehen, können Sie gerne zu dem Abschnitt dieses Leitfadens springen, der Ihren OpenSSL-Anforderungen entspricht.

Generieren von CSRs

Dieser Abschnitt behandelt OpenSSL-Befehle, die mit der Generierung von CSRs (und privaten Schlüsseln, falls sie noch nicht existieren) zusammenhängen. CSRs können verwendet werden, um SSL-Zertifikate von einer Zertifizierungsstelle anzufordern.

Beachten Sie, dass Sie die CSR-Informationen nicht interaktiv mit der Option -subj hinzufügen können, die im vorherigen Abschnitt erwähnt wurde.

Erzeugen Sie einen privaten Schlüssel und einen CSR

Verwenden Sie diese Methode, wenn Sie HTTPS (HTTP über TLS) verwenden möchten, um Ihren Apache HTTP- oder Nginx-Webserver zu sichern, und wenn Sie eine Zertifizierungsstelle (CA) verwenden möchten, um das SSL-Zertifikat auszustellen. Der generierte CSR kann an eine CA gesendet werden, um die Ausstellung eines von der CA signierten SSL-Zertifikats anzufordern. Wenn Ihre CA SHA-2 unterstützt, fügen Sie die Option -sha256 hinzu, um den CSR mit SHA-2 zu signieren.

Dieser Befehl erstellt einen 2048-Bit-privaten Schlüssel (domain.key) und einen CSR (domain.csr) von Grund auf neu:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

Beantworten Sie die CSR-Informationen, um den Vorgang abzuschließen.

Die Option -newkey rsa:2048 legt fest, dass der Schlüssel mit einer Länge von 2048 Bit generiert wird und den RSA-Algorithmus verwendet. Die Option -nodes legt fest, dass der private Schlüssel nicht mit einem Passwort verschlüsselt werden soll. Die Option -new, die hier nicht enthalten ist, aber impliziert wird, zeigt an, dass ein CSR generiert wird.

Generieren eines CSR aus einem vorhandenen privaten Schlüssel

Verwenden Sie diese Methode, wenn Sie bereits einen privaten Schlüssel haben, den Sie verwenden möchten, um ein Zertifikat von einer Zertifizierungsstelle anzufordern.

Dieser Befehl erstellt einen neuen CSR (domain.csr) basierend auf einem vorhandenen privaten Schlüssel (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

Beantworten Sie die CSR-Informationen, um den Vorgang abzuschließen.

Die Option -key legt einen vorhandenen privaten Schlüssel fest (domain.key), der verwendet wird, um einen neuen CSR zu generieren. Die Option -new gibt an, dass ein CSR generiert wird.

Generieren eines CSR aus einem vorhandenen Zertifikat und privaten Schlüssel

Verwenden Sie diese Methode, wenn Sie ein vorhandenes Zertifikat erneuern möchten, aber Sie oder Ihre CA aus irgendeinem Grund nicht über den ursprünglichen CSR verfügen. Es erspart Ihnen im Grunde die Mühe, die CSR-Informationen erneut einzugeben, da diese Informationen aus dem vorhandenen Zertifikat extrahiert werden.

Dieser Befehl erstellt einen neuen CSR (domain.csr) auf Basis eines vorhandenen Zertifikats (domain.crt) und eines privaten Schlüssels (domain.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

Die Option -x509toreq gibt an, dass Sie ein X509-Zertifikat verwenden, um einen CSR zu erstellen.

SSL-Zertifikate generieren

Wenn Sie ein SSL-Zertifikat verwenden möchten, um einen Dienst zu sichern, aber kein von einer CA signiertes Zertifikat benötigen, ist eine gültige (und kostenlose) Lösung, Ihre eigenen Zertifikate zu signieren.

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

Dieser Abschnitt behandelt OpenSSL-Befehle, die mit der Generierung von selbstsignierten Zertifikaten zusammenhängen.

Generieren eines selbstsignierten Zertifikats

Verwenden Sie diese Methode, wenn Sie HTTPS (HTTP über TLS) verwenden möchten, um Ihren Apache HTTP- oder Nginx-Webserver zu sichern, und Sie nicht benötigen, dass Ihr Zertifikat von einer CA signiert ist.

Dieser Befehl erstellt einen 2048-Bit-Privatschlüssel (domain.key) und ein selbstsigniertes Zertifikat (domain.crt) von Grund auf:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

Beantworten Sie die CSR-Informationseingabeaufforderung, um den Vorgang abzuschließen.

Die Option -x509 teilt req mit, ein selbstsigniertes Zertifikat zu erstellen. Die Option -days 365 legt fest, dass das Zertifikat 365 Tage lang gültig ist. Es wird eine temporäre CSR generiert, um Informationen zu sammeln, die mit dem Zertifikat verbunden werden sollen.

Generieren Sie ein selbstsigniertes Zertifikat aus einem vorhandenen Privatschlüssel

Verwenden Sie diese Methode, wenn Sie bereits einen Privatschlüssel haben, mit dem Sie ein selbstsigniertes Zertifikat erstellen möchten.

Dieser Befehl erstellt ein selbstsigniertes Zertifikat (domain.crt) aus einem vorhandenen Privatschlüssel (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

Beantworten Sie die CSR-Informationseingabeaufforderung, um den Vorgang abzuschließen.

Die Option -x509 teilt req mit, ein selbstsigniertes Zertifikat zu erstellen. Die Option -days 365 legt fest, dass das Zertifikat 365 Tage lang gültig ist. Die Option -new aktiviert die CSR-Informationseingabeaufforderung.

Generieren Sie ein selbstsigniertes Zertifikat aus einem vorhandenen privaten Schlüssel und CSR

Verwenden Sie diese Methode, wenn Sie bereits einen privaten Schlüssel und CSR haben und ein selbstsigniertes Zertifikat damit generieren möchten.

Dieser Befehl erstellt ein selbstsigniertes Zertifikat (domain.crt) aus einem vorhandenen privaten Schlüssel (domain.key) und (domain.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

Die Option -days 365 gibt an, dass das Zertifikat 365 Tage lang gültig sein wird.

Zertifikate anzeigen

Zertifikats- und CSR-Dateien sind im PEM-Format codiert, das nicht sofort lesbar ist.

Dieser Abschnitt behandelt OpenSSL-Befehle, die die tatsächlichen Einträge von PEM-codierten Dateien ausgeben.

CSR-Einträge anzeigen

Dieser Befehl ermöglicht es Ihnen, die Inhalte eines CSR (domain.csr) im Klartext anzuzeigen und zu überprüfen:

  1. openssl req -text -noout -verify -in domain.csr

Zertifikatseinträge anzeigen

Dieser Befehl ermöglicht es Ihnen, den Inhalt eines Zertifikats (domain.crt) im Klartext anzuzeigen:

  1. openssl x509 -text -noout -in domain.crt

Zertifikat überprüfen, ob es von einer CA signiert wurde

Verwenden Sie diesen Befehl, um zu überprüfen, ob ein Zertifikat (domain.crt) von einem bestimmten CA-Zertifikat (ca.crt) signiert wurde:

  1. openssl verify -verbose -CAFile ca.crt domain.crt

Private Schlüssel

Dieser Abschnitt behandelt OpenSSL-Befehle, die spezifisch für das Erstellen und Überprüfen von privaten Schlüsseln sind.

Erstellen eines privaten Schlüssels

Verwenden Sie diesen Befehl, um einen passwortgeschützten, 2048-Bit-privaten Schlüssel (domain.key) zu erstellen:

  1. openssl genrsa -des3 -out domain.key 2048

Geben Sie ein Passwort ein, wenn Sie dazu aufgefordert werden, um den Vorgang abzuschließen.

Überprüfen Sie einen privaten Schlüssel

Verwenden Sie diesen Befehl, um zu überprüfen, ob ein privater Schlüssel (domain.key) ein gültiger Schlüssel ist:

  1. openssl rsa -check -in domain.key

Wenn Ihr privater Schlüssel verschlüsselt ist, werden Sie zur Eingabe seiner Passphrase aufgefordert. Bei Erfolg wird der unverschlüsselte Schlüssel im Terminal ausgegeben.

Überprüfen Sie, ob ein privater Schlüssel mit einem Zertifikat und einem CSR übereinstimmt

Verwenden Sie diese Befehle, um zu überprüfen, ob ein privater Schlüssel (domain.key) mit einem Zertifikat (domain.crt) und einem CSR (domain.csr) übereinstimmt:

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

Wenn die Ausgabe jedes Befehls identisch ist, besteht eine äußerst hohe Wahrscheinlichkeit, dass der private Schlüssel, das Zertifikat und der CSR miteinander verbunden sind.

Ein privaten Schlüssel verschlüsseln

Dies nimmt einen unverschlüsselten privaten Schlüssel (unencrypted.key) und gibt eine verschlüsselte Version davon aus (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

Geben Sie Ihre gewünschte Passphrase ein, um den privaten Schlüssel zu verschlüsseln.

Entschlüsseln Sie einen privaten Schlüssel

Dies nimmt einen verschlüsselten privaten Schlüssel (encrypted.key) und gibt eine entschlüsselte Version davon aus (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

Geben Sie das Passwort für den verschlüsselten Schlüssel ein, wenn Sie dazu aufgefordert werden.

Konvertieren von Zertifikatformaten

All die Zertifikate, mit denen wir gearbeitet haben, waren X.509-Zertifikate, die als ASCII PEM-codiert sind. Es gibt eine Vielzahl anderer Zertifikatcodierungs- und Container-Typen; einige Anwendungen bevorzugen bestimmte Formate gegenüber anderen. Außerdem können viele dieser Formate mehrere Elemente wie einen privaten Schlüssel, ein Zertifikat und ein CA-Zertifikat in einer einzigen Datei enthalten.

OpenSSL kann verwendet werden, um Zertifikate in eine Vielzahl dieser Formate zu konvertieren. In diesem Abschnitt werden einige der möglichen Konvertierungen behandelt.

Konvertieren von PEM nach DER

Verwenden Sie diesen Befehl, wenn Sie ein PEM-codiertes Zertifikat (domain.crt) in ein DER-codiertes Zertifikat (domain.der), ein binäres Format, konvertieren möchten:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

Das DER-Format wird typischerweise mit Java verwendet.

DER in PEM umwandeln

Verwenden Sie diesen Befehl, wenn Sie ein DER-codiertes Zertifikat (domain.der) in ein PEM-codiertes Zertifikat (domain.crt) umwandeln möchten:

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

PEM in PKCS7 umwandeln

Verwenden Sie diesen Befehl, wenn Sie PEM-Zertifikate (domain.crt und ca-chain.crt) zu einer PKCS7-Datei (domain.p7b) hinzufügen möchten:

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

Beachten Sie, dass Sie eine oder mehrere -certfile-Optionen verwenden können, um anzugeben, welche Zertifikate der PKCS7-Datei hinzugefügt werden sollen.

PKCS7-Dateien, auch als P7B bekannt, werden typischerweise in Java-Keystores und Microsoft IIS (Windows) verwendet. Es handelt sich um ASCII-Dateien, die Zertifikate und CA-Zertifikate enthalten können.

PKCS7 in PEM umwandeln

Verwenden Sie diesen Befehl, wenn Sie eine PKCS7-Datei (domain.p7b) in eine PEM-Datei umwandeln möchten:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

Beachten Sie, dass wenn Ihre PKCS7-Datei mehrere Elemente enthält (z. B. ein Zertifikat und ein CA-Zwischenzertifikat), die erstellte PEM-Datei alle Elemente darin enthält.

Umwandlung von PEM in PKCS12

Verwenden Sie diesen Befehl, wenn Sie einen privaten Schlüssel (domain.key) und ein Zertifikat (domain.crt) nehmen und sie in eine PKCS12-Datei (domain.pfx) kombinieren möchten:

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

Sie werden zur Eingabe von Exportpasswörtern aufgefordert, die Sie leer lassen können. Beachten Sie, dass Sie in diesem Fall eine Zertifikatskette der PKCS12-Datei durch Konkatenieren der Zertifikate in einer einzelnen PEM-Datei (domain.crt) hinzufügen können.

PKCS12-Dateien, auch als PFX-Dateien bekannt, werden typischerweise zum Importieren und Exportieren von Zertifikatsketten in Microsoft IIS (Windows) verwendet.

Umwandlung von PKCS12 in PEM

Verwenden Sie diesen Befehl, wenn Sie eine PKCS12-Datei (domain.pfx) konvertieren und in das PEM-Format (domain.combined.crt) konvertieren möchten:

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

Beachten Sie, dass wenn Ihre PKCS12-Datei mehrere Elemente enthält (z. B. ein Zertifikat und einen privaten Schlüssel), die erstellte PEM-Datei alle Elemente darin enthalten wird.

OpenSSL Version

Der Befehl openssl version kann verwendet werden, um zu überprüfen, welche Version Sie verwenden. Die Version von OpenSSL, die Sie verwenden, und die Optionen, mit denen sie kompiliert wurde, beeinflussen die Funktionen (und manchmal die Befehlszeilenoptionen), die Ihnen zur Verfügung stehen.

Der folgende Befehl zeigt die OpenSSL-Version an, die Sie verwenden, und alle Optionen, mit denen sie kompiliert wurde:

openssl version -a

In diesem Leitfaden wurde ein OpenSSL-Binärprogramm mit den folgenden Details verwendet (die Ausgabe des vorherigen Befehls):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Schlussfolgerung

Damit sollte abgedeckt sein, wie die meisten Personen OpenSSL verwenden, um mit SSL-Zertifikaten zu arbeiten. Es hat viele andere Verwendungsmöglichkeiten, die hier nicht behandelt wurden, daher können Sie gerne weitere Verwendungen in den Kommentaren anfragen oder vorschlagen.

Wenn Sie Probleme mit einem der Befehle haben, kommentieren Sie bitte (und fügen Sie Ihre Ausgabe der OpenSSL-Version hinzu).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs