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

Einführung

OpenSSL ist ein vielseitiges Befehlszeilentool, das für eine Vielzahl von Aufgaben im Zusammenhang mit Public Key Infrastructure (PKI) und HTTPS (HTTP über TLS) verwendet werden kann. Dieser Cheat-Sheet-Styleguide bietet eine schnelle Referenz zu OpenSSL-Befehlen, die in alltäglichen Szenarien nützlich sind. Dies umfasst OpenSSL-Beispiele für das Generieren privater Schlüssel, Zertifikatssignierungsanforderungen und die Konvertierung des Zertifikatformats. Es werden nicht alle Verwendungen von OpenSSL abgedeckt.

  • Verwendung dieses Handbuchs: *

  • Wenn Sie nicht mit Zertifikatsignierungsanforderungen (Certificate Signing Requests, CSRs) vertraut sind, lesen Sie den ersten Abschnitt

  • Abgesehen vom ersten Abschnitt liegt dieses Handbuch in einem einfachen Format für Spickzettel vor - in sich geschlossene Befehlszeilenschnipsel

  • Wechseln Sie zu einem Abschnitt, der für die Aufgabe, die Sie ausführen möchten, relevant ist. (Hinweis: Verwenden Sie das Menü Contents unten links oder die Funktion Find Ihres Browsers.)

  • Bei den meisten Befehlen handelt es sich um einzeilige Befehle, die aus Gründen der Übersichtlichkeit (unter Verwendung des Symbols "+ \ +") zu mehreren Zeilen erweitert wurden

Informationen zu Zertifikatsignierungsanforderungen (Certificate Signing Requests, CSRs)

Wenn Sie ein SSL-Zertifikat von einer Zertifizierungsstelle erhalten möchten, müssen Sie eine Zertifikatsignierungsanforderung (Certificate Signing Request, CSR) generieren. Ein CSR besteht hauptsächlich aus dem öffentlichen Schlüssel eines Schlüsselpaares und einigen zusätzlichen Informationen. Beide Komponenten werden beim Signieren in das Zertifikat eingefügt.

Wann immer Sie eine CSR generieren, werden Sie aufgefordert, Informationen zum Zertifikat anzugeben. Diese Informationen werden als Distinguished Name (DN) bezeichnet. Ein wichtiges Feld im DN ist der * Common Name * (CN), der der genaue vollqualifizierte Domänenname (FQDN) des Hosts sein sollte, mit dem Sie das Zertifikat verwenden möchten. Es ist auch möglich, die interaktiven Eingabeaufforderungen beim Erstellen eines CSR zu überspringen, indem die Informationen über die Befehlszeile oder aus einer Datei übergeben werden.

Die anderen Elemente in einem DN enthalten zusätzliche Informationen zu Ihrem Unternehmen oder Ihrer Organisation. Wenn Sie ein SSL-Zertifikat von einer Zertifizierungsstelle erwerben, ist es häufig erforderlich, dass diese zusätzlichen Felder, z. B. "Organisation", die Details Ihrer Organisation genau wiedergeben.

Hier ist ein Beispiel, wie die CSR-Informationsabfrage aussehen wird:

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

Wenn Sie die CSR-Informationsaufforderung nicht interaktiv beantworten möchten, können Sie dazu die Option "+ -subj +" zu allen OpenSSL-Befehlen hinzufügen, die CSR-Informationen anfordern. Hier ist ein Beispiel für die Option, wobei dieselben Informationen verwendet werden, die im obigen Codeblock angezeigt werden:

-subj "/C=/ST=/L=/O=/CN="

Nachdem Sie die CSRs verstanden haben, können Sie sich in jedem Abschnitt dieses Handbuchs umsehen, der Ihre OpenSSL-Anforderungen abdeckt.

CSRs generieren

Dieser Abschnitt behandelt OpenSSL-Befehle, die sich auf das Generieren von CSRs beziehen (und private Schlüssel, falls diese noch nicht vorhanden sind). Mithilfe von CSRs können SSL-Zertifikate von einer Zertifizierungsstelle angefordert werden.

Beachten Sie, dass Sie die CSR-Informationen möglicherweise nicht interaktiv mit der im vorherigen Abschnitt erwähnten Option "+ -subj +" hinzufügen.

Generieren Sie einen privaten Schlüssel und eine CSR

Verwenden Sie diese Methode, wenn Sie HTTPS (HTTP über TLS) zum Sichern Ihres Apache HTTP- oder Nginx-Webservers verwenden und eine Zertifizierungsstelle (Certificate Authority, CA) zum Ausstellen des SSL-Zertifikats verwenden möchten. Die generierte CSR kann an eine Zertifizierungsstelle gesendet werden, um die Ausstellung eines von der Zertifizierungsstelle signierten SSL-Zertifikats anzufordern. Wenn Ihre Zertifizierungsstelle SHA-2 unterstützt, fügen Sie die Option "+ -sha256 +" hinzu, um die CSR mit SHA-2 zu signieren.

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

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -out

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

Die Option + -newkey rsa: 2048 + gibt an, dass der Schlüssel 2048-Bit sein soll und mit dem RSA-Algorithmus generiert wird. Die Option "+ -nodes " gibt an, dass der private Schlüssel nicht mit einer Passphrase verschlüsselt werden soll. Die hier nicht enthaltene, aber implizierte Option " -new +" zeigt an, dass eine CSR generiert wird.

Generieren Sie eine CSR aus einem vorhandenen privaten Schlüssel

Verwenden Sie diese Methode, wenn Sie bereits einen privaten Schlüssel haben, mit dem Sie ein Zertifikat von einer Zertifizierungsstelle anfordern möchten.

Dieser Befehl erstellt eine neue CSR (+ domain.csr +) basierend auf einem vorhandenen privaten Schlüssel (+ domain.key +):

openssl req \
      -key  \
      -new -out

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

Die Option "+ -key " gibt einen vorhandenen privaten Schlüssel (" domain.key ") an, der zum Generieren einer neuen CSR verwendet wird. Die Option " -new +" zeigt an, dass eine CSR generiert wird.

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

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

Dieser Befehl erstellt eine neue CSR (+ domain.csr +) basierend auf einem vorhandenen Zertifikat (+ domain.crt +) und einem privaten Schlüssel (+ domain.key +):

openssl x509 \
      -in  \
      -signkey  \
      -x509toreq -out

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

SSL-Zertifikate generieren

Wenn Sie ein SSL-Zertifikat zum Sichern eines Dienstes verwenden möchten, jedoch kein CA-signiertes Zertifikat benötigen, besteht eine gültige (und kostenlose) Lösung darin, Ihre eigenen Zertifikate zu signieren.

Ein gängiger Zertifikatstyp, den Sie selbst ausstellen können, ist ein selbstsigniertes Zertifikat. Ein selbstsigniertes Zertifikat ist ein Zertifikat, das mit einem eigenen privaten Schlüssel signiert ist. Selbstsignierte Zertifikate können genauso wie CA-signierte Zertifikate zum Verschlüsseln von Daten verwendet werden. Ihren Benutzern wird jedoch eine Warnung angezeigt, dass das Zertifikat von ihrem Computer oder Browser nicht als vertrauenswürdig eingestuft wird. Selbstsignierte Zertifikate sollten daher nur verwendet werden, wenn Sie die Identität Ihres Dienstes gegenüber seinen Benutzern nicht nachweisen müssen (z. Nichtproduktive oder nichtöffentliche Server).

Dieser Abschnitt behandelt OpenSSL-Befehle, die sich auf das Generieren von selbstsignierten Zertifikaten beziehen.

Generieren Sie ein selbstsigniertes Zertifikat

Verwenden Sie diese Methode, wenn Sie HTTPS (HTTP über TLS) zum Sichern Ihres Apache-HTTP- oder Nginx-Webservers verwenden möchten und Ihr Zertifikat nicht von einer Zertifizierungsstelle signiert sein muss.

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

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -x509 -days 365 -out

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

Die Option "+ -x509 " weist " req " an, ein selbstsigniertes Zertifikat zu erstellen. Die Option " -days 365 +" gibt an, dass das Zertifikat 365 Tage gültig ist. Eine temporäre CSR wird generiert, um Informationen für die Zuordnung zum Zertifikat zu sammeln.

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

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

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

openssl req \
      -key  \
      -new \
      -x509 -days 365 -out

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

Die Option "+ -x509 " weist " req " an, ein selbstsigniertes Zertifikat zu erstellen. Die Option " -days 365 " gibt an, dass das Zertifikat 365 Tage gültig ist. Die Option " -new +" aktiviert die CSR-Informationsabfrage.

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

Verwenden Sie diese Methode, wenn Sie bereits über einen privaten Schlüssel und eine CSR verfügen und mit ihnen ein selbstsigniertes Zertifikat generieren möchten.

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

openssl x509 \
      -signkey  \
      -in  \
      -req -days 365 -out

Die Option "+ -days 365 +" gibt an, dass das Zertifikat 365 Tage gültig ist.

Zertifikate anzeigen

Zertifikats- und CSR-Dateien sind im PEM-Format codiert, das nicht ohne Weiteres für den Menschen lesbar ist.

Dieser Abschnitt behandelt OpenSSL-Befehle, mit denen die tatsächlichen Einträge von PEM-codierten Dateien ausgegeben werden.

CSR-Einträge anzeigen

Mit diesem Befehl können Sie den Inhalt einer CSR (+ domain.csr +) im Klartext anzeigen und überprüfen:

openssl req -text -noout -verify -in

Zertifikateinträge anzeigen

Mit diesem Befehl können Sie den Inhalt eines Zertifikats (+ domain.crt +) im Klartext anzeigen:

openssl x509 -text -noout -in

Überprüfen Sie, ob ein Zertifikat von einer Zertifizierungsstelle signiert wurde

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

openssl verify -verbose -CAFile

Private Schlüssel

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

Erstellen Sie einen privaten Schlüssel

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

openssl genrsa -des3 -out  2048

Geben Sie ein Passwort ein, wenn Sie aufgefordert werden, 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:

openssl rsa -check -in

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

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

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

openssl rsa -noout -modulus -in  | openssl md5
openssl x509 -noout -modulus -in  | openssl md5
openssl req -noout -modulus -in  | openssl md5

Wenn die Ausgabe jedes Befehls identisch ist, besteht eine extrem hohe Wahrscheinlichkeit, dass der private Schlüssel, das Zertifikat und die CSR in Beziehung stehen.

Verschlüsseln Sie einen privaten Schlüssel

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

openssl rsa -des3 \
      -in  \
      -out

Geben Sie Ihre gewünschte Passphrase ein, um den privaten Schlüssel mit 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 +):

openssl rsa \
      -in  \
      -out

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

Zertifikatsformate konvertieren

Alle Zertifikate, mit denen wir gearbeitet haben, waren X.509-Zertifikate, die ASCII-PEM-codiert sind. Es gibt eine Vielzahl anderer Zertifikatcodierungs- und Containertypen. Einige Anwendungen bevorzugen bestimmte Formate gegenüber anderen. Viele dieser Formate können auch mehrere Elemente, z. B. einen privaten Schlüssel, ein Zertifikat und ein Zertifizierungsstellenzertifikat, in einer einzigen Datei enthalten.

Mit OpenSSL können Zertifikate in und aus einer Vielzahl dieser Formate konvertiert werden. In diesem Abschnitt werden einige der möglichen Konvertierungen behandelt.

Umwandlung von PEM in DER

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

openssl x509 \
      -in  \
      -outform der -out

Das DER-Format wird normalerweise mit Java verwendet.

Umwandlung von DER in PEM

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

openssl x509 \
      -inform der -in  \
      -out

Konvertieren Sie PEM in PKCS7

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

openssl crl2pkcs7 -nocrl \
      -certfile  \
      -certfile  \
      -out domain.p7b

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

PKCS7-Dateien, auch als P7B bezeichnet, werden normalerweise in Java Keystores und Microsoft IIS (Windows) verwendet. Dies sind ASCII-Dateien, die Zertifikate und CA-Zertifikate enthalten können.

Konvertieren Sie PKCS7 in PEM

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

openssl pkcs7 \
      -in  \
      -print_certs -out

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

Konvertieren Sie PEM in PKCS12

Verwenden Sie diesen Befehl, wenn Sie einen privaten Schlüssel (+ domain.key +) und ein Zertifikat (+ domain.crt +) verwenden und diese zu einer PKCS12-Datei (+ domain.pfx +) kombinieren möchten:

openssl pkcs12 \
      -inkey  \
      -in  \
      -export -out

Sie werden zur Eingabe von Exportkennwörtern aufgefordert, die Sie möglicherweise leer lassen. Beachten Sie, dass Sie der PKCS12-Datei eine Zertifikatskette hinzufügen können, indem Sie die Zertifikate in diesem Fall in einer einzigen PEM-Datei (+ domain.crt +) zusammenfassen.

PKCS12-Dateien, auch PFX-Dateien genannt, werden normalerweise zum Importieren und Exportieren von Zertifikatketten in Microsoft IIS (Windows) verwendet.

Konvertieren Sie 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  \
      -nodes -out

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

OpenSSL-Version

Mit dem Befehl + openssl version + können Sie überprüfen, welche Version Sie ausführen. Die Version von OpenSSL, die Sie ausführen, und die Optionen, mit denen es kompiliert wurde, wirken sich auf die Funktionen (und manchmal auf die Befehlszeilenoptionen) aus, die Ihnen zur Verfügung stehen.

Der folgende Befehl zeigt die von Ihnen ausgeführte OpenSSL-Version und alle Optionen an, mit denen sie kompiliert wurde:

openssl version -a

Dieses Handbuch wurde mit einer OpenSSL-Binärdatei mit den folgenden Details (der Ausgabe des vorherigen Befehls) geschrieben:

OpenSSL 1.0.1f 6 Jan 2014
built on: Mon Apr  7 21:22:23 UTC 2014
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

Fazit

Das sollte abdecken, wie die meisten Leute OpenSSL verwenden, um mit SSL-Zertifikaten umzugehen! Es hat viele andere Verwendungszwecke, die hier nicht behandelt wurden. Sie können also gerne fragen oder in den Kommentaren andere Verwendungszwecke vorschlagen.

Wenn Sie Probleme mit einem der Befehle haben, stellen Sie sicher, dass Sie einen Kommentar abgeben (und die Ausgabe Ihrer OpenSSL-Version einschließen).