OpenSSL Zertifikat Handbuch

Willkommen zum ultimativen OpenSSL Zertifikat Handbuch

OpenSSL ist ein Open-Source-Toolkit zur Implementierung des SSL- und TLS-Protokolls sowie ein allgemeines Kryptographie-Toolkit. Es bietet eine Vielzahl von Befehlen für die Generierung und Verwaltung von Zertifikaten, privaten Schlüsseln und anderen kryptografischen Elementen. In diesem Artikel werden die gängigsten OpenSSL-Befehle mit entsprechenden Beispielen vorgestellt.

Der Artikel enthält sowohl die älteren als auch die neuen Befehle (OpenSSL ≥ 3.0). Die neuen Befehle werden in neueren OpenSSL-Versionen empfohlen, insbesondere, wenn du mit unterschiedlichen Algorithmen arbeiten musst (z.B. Elliptic-Curve-Schlüssel, DSA-Schlüssel etc.)

Weiterführende Lektüre:

OpenSSL

Sämtliche in diesem OpenSSL Zertifikat Handbuch vorgestellten Befehle etc. werden mit OpenSSL, einer freien Software für TLS (damals SSL), durchgeführt. Wir empfehlen, die aktuellste Version zu verwenden. Zum Zeitpunkt der Erstellung dieses Artikels ist das die Version 3.3.2, welche am 03.09.2024 erschienen ist. Solltest du bereits OpenSSL installiert haben, kannst du die Version ganz einfach prüfen:

Bash
openssl version

Ausgabe:

OpenSSL 3.3.2 3 Sep 2024 (Library: OpenSSL 3.3.2 3 Sep 2024)

Solltest du noch kein OpenSSL installiert haben, kannst du es von folgenden Seiten beziehen:

Windows: https://slproweb.com/products/Win32OpenSSL.html*

Linux: https://openssl-library.org/source/index.html oder mittels des Paketmanagers deiner Distribution (APT, YUM etc.)

GitHub: https://github.com/openssl/openssl

Natürlich kannst du unter Linux auch deinen eigenen Build mittels make kompilieren, hierauf werden wir in diesem Artikel jedoch nicht eingehen.

* Dies ist nicht die offizielle OpenSSL-Website, da OpenSSL selbst keine vorkompilierten Pakete für Windows zur Verfügung stellt.

Zertifikatstypen

SSL/TLS

SSL/TLS-Zertifikate werde verwendet um sichere Verbindungen (HTTPS) zwischen einem Webbrowser (Client) und einen Webserver zu ermöglichen. Sie gewährleisten Verschlüsselung und Authentifizierung um sicherzustellen, dass die Kommunikation sicher und vertrauenswürdig ist.

Zertifikate unterscheiden sich zum einen durch die Art und Weise, wie die Validierung durchgeführt wird:

  • Domain Validated (DV): Dieses Zertifikat validiert nur die Domäne. Es wird überprüft, ob der Antragsteller die Kontrolle über die Domäne besitzt, erfordert jedoch keine tiefere Identitätsprüfung. Die Validierung geschieht meist durch das Beantworten einer von der Zertifizierungsstelle an admin@, administrator@, hostmaster@ oder postmaster@ versendete E-Mail. Alternativ kann ein von der Zertifizierungsstelle vorgegebener TXT-Eintrag im DNS gesetzt werden. Es ist eines der meist eingesetzten Zertifikate, insbesondere bei kleinen Websites.
  • Organization Validated (OV): Im Gegensatz zum DV-Zertifikat wird hierbei auch die Identität der Organisation geprüft. Dies geschieht durch die Einreichung eines Auszugs aus dem Handelsregister.
  • Extended Validation (EV): Diese Zertifikate unterliegen einer strengen Überprüfung. Antragsteller müssen unter anderem Kriterien erfüllen wie beispielsweise: Domäne, Domänen-Inhaber, Identität, Postanschrift, Rechtsstatus, operative Existenz. EV-Zertifikate sind erhältlich für große Firmen, Banken, eingetragene Vereine und Behörden.

Des Weiteren gibt es unterschiedliche Arten von SSL/TLS-Zertifikaten (die meisten dieser Arten können als DV, OV oder EV bezogen werden):

  • Einzelzertifikat: Dieses Zertifikat sichert eine einzige Domäne ab, bspw. it-tech.wiki. Häufig wird die Subdomain www. gratis mitabgesichert.
  • Multidomain-Zertifikate (MDC): Hier können mehrere Domänen, sogenannte SANs (Subject Alternative Names), abgesichert werden. Es können bis zu 100 verschiedene Domänen und Subdomänen angegeben werden.
  • Unified Communication (UC)-Zertifikate: Dies ist eine spezielle Version von Multidomain Zertifikaten. Es wurde ursprünglich für Microsoft Exchange und Microsoft Office Communication Server konzipiert.
  • Wildcard-Zertifikate: Ein Wildcard-Zertifikat kann beliebig viele Subdomänen einer Stufe absichern. D.h., man kann bspw. forum.it-tech.wiki, blog.it-tech.wiki, shop.it-tech.wiki etc. absichern, aber nicht de.blog.it-tech.wiki oder static.cdn.it-tech.wiki. Auch die Domäne selbst, it-tech.wiki, gehört technisch nicht dazu. Einige Zertifizierungsstellen bieten jedoch häufig einen zweiten SAN gratis an, sodass man neben *.it-tech.wiki auch it-tech.wiki mit dem Wildcard-Zertifikat absichern kann. Multi-Level-Wildcard-Zertifikate (*.*.it-tech.wiki) gibt es nicht (obwohl einige Browser eine Unterstützung hierfür an Board haben).
  • Multidomain-Wildcard-Zertifikate: Wie der Name schon erraten lässt, bietet dieses Zertifikate die Vorteile eines Wildcard-Zertifikats gepaart mit denen eines Multidomain-Zertifikates. Diese sichern in der Regel die TLDs ab, also it-tech.wiki und z.B. it-tech.shop, sondern auch alle Subdomänen des zweiten Ebene, bspw. de.it-tech.wiki, cdn.it-tech.wiki, mail.it-tech.shop, support.it-tech.shop etc.

E-Mail-Zertifikate (S/MIME)

S/MIME (Secure/Multipurpose Internet Mail Extensions)-Zertifikate werden genutzt, um E-Mails zu signieren und zu verschlüsseln. Die digitale Signatur garantiert die Authentizität und Integrität der E-Mail, stellt also sicher, dass diese nicht manipuliert wurde. Durch die Verschlüsselung wird zudem sichergestellt, dass nur der adressierte Empfänger die Nachricht entschlüsseln und lesen kann.

Auch bei dem E-Mail-Zertifikaten gibt es unterschiedliche Validierungsformen:

  • E-Mail-Validiert (DV): Bei dieser Variante wird lediglich geprüft, ob der Antragsteller Zugriff auf die E-Mail-Adresse hat, z.B. indem er einen an die E-Mail-Adresse gesendeten Link aufruft oder einen erhaltenen Code bei der Zertifizierungsstelle eingibt.
  • Individual Validated (IV): Wie DV-Zertifikate, allerdings ist zusätzlich der Name des Antragsstellers im Zertifikat enthalten. Die Identität des Antragstellers wird mit einem amtlichen Ausweisdokument und ggf. einer Videoverifizierung sichergestellt.
  • Organisationsvalidiert (OV): Der Validierungsprozess entspricht dem eines organisationsvalidierten SSL/TLS-Zertifikats. Neben der Person wird auch die Organisation (Handelsregisterauszug, Steuerdokumente etc.) überprüft.

Weitere Zertifikate

Darüber hinaus gibt es noch viele weitere Formate, bspw. Code Signing Zertifikate, um Software-Signaturen zu erstellen, Client-Zertifikate, um die Authentifizierung von Benutzern und Geräten sicherzustellen, Document Signing-Zertifikate, um digitale Dokumente (z.B. PDFs) digital zu unterschreiben (signieren) und natürlich Intermediate- und Root-Zertifikate. Auf diese werden wir in diesem Artikel jedoch nicht näher eingehen.

Zertifikatsformate

  1. unvollständige Liste, nur beispielhaft ↩︎

Allgemeines

Aufbau einer Zertifikatskette

Eine Zertifikatskette enthält mehrere Zertifikate innerhalb einer Datei. In der Regel liegen diese im PEM-Format vor und haben folgendes Format:

Bash
-----BEGIN CERTIFICATE-----
...    (Zertifikat)     ...
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
...(Zwischenzertifikat) ...
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
...  (Root-Zertifikat)  ...
------END CERTIFICATE------

Private Schlüssel mit RSA

Bewahre deine privaten Schlüssel immer an einem sicheren Ort auf!

Übersicht der RSA-Schlüssel

Generieren eines privaten Schlüssels mit RSA

Bash
openssl genpkey -algorithm RSA -out private_key.pem
Bash
openssl genrsa -out private.pem

Diese Befehle erstellen einen RSA-Schlüssel mit der Standardgröße von 2048 Bits.

Generieren eines privaten Schlüssels spezifischer Länge mit RSA

Solltest du einen Schlüssel anderer Größe benötigen, kannst du diese als Parameter übergeben und somit einen Schlüssel mit einer spezifischen Länge generieren. Im folgenden Beispiel erstellen wir einen privaten Schlüssel mit einer Länge von 4096 Bit:

Bash
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096
Bash
openssl genrsa -out private.pem 4096

Private Schlüssel mit elliptischen Kurven (ECDSA)

Der Vorteil von elliptischen Kurven sind die wesentlich kürzeren Schlüssel gegenüber ihre äquivalenten RSA-Schlüssel bei gleichem Sicherheitsniveau. Dies macht sie besonders effizient, da für die das gleiche Sicherheitsniveau weniger Rechenleistung und Speicher benötigt wird.

Bei Schlüssel mit elliptischen Kurven wird die Schlüssellänge nicht über die Angabe der Länge in Bit, wie bei RSA, definiert, sondern durch die Wahl der entsprechenden Kurve.

Übersicht der wichtigsten elliptischen Kurven

Auflisten aller unterstützen Kurvenparameter

Bash
openssl ecparam -list_curves

Generieren eines privaten Schlüssels mit ECDSA

Bash
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out private_key_ecdsa.pem
Bash
openssl ecparam -genkey -name prime256v1 -out private_key_ecdsa.pem

Generieren einer Zertifikatsanforderung

CSR mit Parametern

Während der Ausführung wirst du aufgefordert, verschiedene Informationen einzugeben. Bei der Common Name (CN)-Abfrage gib den Domänen-Namen ein, z.B. it-tech.wiki oder bei einem Wildcard-Zertifikat *.it-tech.wiki.

Bash
# Generiere einen privaten Schlüssel
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# Erstelle eine CSR mit interaktiver Eingabe
openssl req -new -key private_key.pem -out request.csr
Bash
# Generiere einen privaten Schlüssel
openssl genrsa -out private_key.pem 2048
# Erstelle eine CSR mit interaktiver Eingabe
openssl req -new -key private_key.pem -out request.csr

CSR mit einer Konfigurationsdatei

req.conf
[req]
prompt = no
distinguished_name = req_distinguished_name

[req_distinguished_name]
C = DE
ST = NRW
L = Duisburg
O = IT-Tech
OU = IT
CN = *.it-tech.wiki

Erstelle nun mithilfe der Konfigurationsdatei einen privaten Schlüssel (wenn noch nicht vorhanden) und den CSR.

Bash
# Generiere einen privaten Schlüssel
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# Erstelle die CSR mit der Konfigurationsdatei
openssl req -new -key private_key.pem -out request.csr -config req.conf
Bash
# Generiere einen privaten Schlüssel
openssl genrsa -out private_key.pem 2048
# Erstelle den CSR mit der Konfigurationsdatei
openssl req -new -key private_key.pem -out request.csr -config req.conf

CSR mit einer Konfigurationsdatei und mehreren SANs

req.conf
[req]
prompt = no
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
C = DE
ST = NRW
L = Duisburg
O = IT-Tech
OU = IT
CN = *.it-tech.wiki

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.it-tech.wiki
DNS.2 = it-tech.wiki

Vernwende die Schreibweise *.domain.tld für sogenannte Wildcard-Zertifikate. Viele Zertifikatsanbieter sichern kostenlos einen weiteren SAN ab, hier empfiehlt es sich sehr, die Domain (domain.tld) selbst anzugeben (siehe obiges Beispiel).

Der Befehl zum Erzeugen des privaten Schlüssels und des CSR sind identisch zu 2.2.

CSR mit ECDSA und SANs

Bash
# Generiere einen ECDSA-Schlüssel
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out private_key_ecdsa.pem
# Erstelle einen CSR mit der Konfigurationsdatei
openssl req -new -key private_key_ecdsa.pem -out request_ecdsa.csr -config req.conf
Bash
# Generiere einen ECDSA-Schlüssel
openssl ecparam -genkey -name prime256v1 -out private_key_ecdsa.pem
# Erstelle einen CSR mit der Konfigurationsdatei
openssl req -new -key private_key_ecdsa.pem -out request_ecdsa.csr -config req.conf

Private Schlüssel und Zertifikate konvertieren

PEM zu DER

Bash
openssl x509 -in cert.pem -outform der -out cert.der

DER zu PEM

Bash
openssl x509 -in cert.der -inform der -out cert.pem -outform pem

PEM zu PKCS12

Bash
openssl pkcs12 -export -out cert.p12 -inkey private_key.pem -in cert.pem -certfile chain.pem

Die Angabe des Parameters -certfile zur Angabe von Zwischenzertifikaten ist optional.

Wenn Du das Root-Zertifikat ebenfalls einschließen möchtest, füge es mit zur Kette in der Datei chain.pem hinzu.

PKCS12 zu PEM

Bash
openssl pkcs12 -in cert.p12 -out cert.pem -nodes

Private Schlüssel und Zertifikate prüfen

Prüfen eines privaten Schlüssels

Bash
openssl pkey -in private_key.pem -check
Bash
openssl rsa -in private_key.pem -check

Prüfen eines Zertifikats

Bash
openssl x509 -in cert.pem -text -noout

Prüfen eines CSR

Bash
openssl req -in request.csr -text -noout

Prüfen, ob ein privater Schlüssel, ein Zertifikat und ein CSR zusammenpassen

Um zu überprüfen, ob ein privater Schlüssel, ein Zertifikat und ein CSR zusammenpassen, kannst du mit OpenSSL einen Vergleich durchführen. Dies funktioniert, indem du den "Modulus" aller Dateien vergleichst. Es ist wichtig, dass du das richtige Format für jede Datei verwendest. Der private Schlüssel muss z.B. im PEM-Format sein, und auch die CSR sollte in einem standardisierten Format wie PEM vorliegen.

Zuerst musst du den Modulus des privaten Schlüssels überprüfen:

Bash
openssl rsa -noout -modulus -in privkey.pem | openssl md5

Dann extrahiere den Modulus des Zertifikats:

Bash
openssl x509 -noout -modulus -in cert.pem | openssl md5

Nun zeige den Modulus der CSR an:

Bash
openssl req -noout -modulus -in request.csr | openssl md5

Alle drei MD5-Hashes sollten identisch sein, wenn der private Schlüssel, das Zertifikat und der CSR zusammenpassen. Wenn einer der Werte unterschiedlich ist, dann stimmt etwas nicht.

Zertifikate signieren

Ein selbst signiertes Zertifikat erstellen

Bash
openssl req -new -x509 -key private_key.pem -out cert.pem -days 365

Ein Zertifikat mittels CA signieren

Bash
openssl x509 -req -in request.csr -CA ca_cert.pem -CAkey ca_key.pem -CAcreateserial -out cert.pem -days 365

Schlüssel manipulieren

Privaten Schlüssel aus einer PEM-Datei extrahieren

Bash
openssl pkey -in cert_and_key.pem -out private_key.pem
Bash
openssl rsa -in cert_and_key.pem -out private_key.pem

Privaten Schlüssel aus einer PFX/P12-Datei (PKCS12) extrahieren

Bash
openssl pkcs12 -in file.pfx -nocerts -out private_key.pem -nodes

Privaten Schlüssel mit einer Passphrase schützen

Bash
openssl pkey -in private_key.pem -aes256 -out encrypted_key.pem
Bash
openssl rsa -in private_key.pem -des3 -out encrypted_key.pem

Passphrase von einem privaten Schlüssel entfernen

Bash
openssl pkey -in encrypted_key.pem -out unencrypted_key.pem
Bash
openssl rsa -in encrypted_key.pem -out unencrypted_key.pem

Sonstiges

Zertifikatskette einer Webseite anzeigen

Bash
openssl s_client -connect it-tech.wiki:443 -showcerts

Appendix

Abkürzungen

Schreibe einen Kommentar

Kommentare werden nicht direkt angezeigt, da sie moderiert freigegeben werden.


WordPress Cookie Plugin von Real Cookie Banner