# OpenSSL — TLS, Zertifikate und Kryptografie auf der Kommandozeile

> Praxis-Guide zu OpenSSL — Zertifikate und CSRs erzeugen, Keys verwalten, TLS-Verbindungen testen, Dateien ver- und entschlüsseln und Hashes berechnen.

Source: https://www.jpkc.com/db/cheatsheets/security/openssl/

<!-- PROSE:intro -->
OpenSSL ist das Standard-Toolkit für TLS/SSL und Kryptografie auf der Kommandozeile. Mit einem einzigen Befehl erzeugst du Zertifikate und CSRs, verwaltest Schlüssel, testest TLS-Verbindungen oder ver- und entschlüsselst Dateien. Das Werkzeug beherrscht außerdem Hashes, HMAC und die Konvertierung zwischen Formaten wie PEM, DER und PKCS#12. Dieser Guide führt dich durch die Kommandos für den Alltag – von der Zertifikatsprüfung bis zur AES-Verschlüsselung. Behandle private Schlüssel dabei immer als Geheimnis: restriktive Dateirechte, starke Cipher und keine selbstsignierten Zertifikate im Produktivbetrieb.
<!-- PROSE:intro:end -->

## Zertifikats-Informationen

`openssl x509 -in <cert> -text -noout` — Zeigt alle Details eines Zertifikats in menschenlesbarer Form an.

```bash
openssl x509 -in server.crt -text -noout
```

`openssl x509 -in <cert> -subject -noout` — Zeigt nur den Subject (CN, O usw.) eines Zertifikats.

```bash
openssl x509 -in server.crt -subject -noout
```

`openssl x509 -in <cert> -issuer -noout` — Zeigt den Aussteller (Issuer) eines Zertifikats.

```bash
openssl x509 -in server.crt -issuer -noout
```

`openssl x509 -in <cert> -dates -noout` — Zeigt den Gültigkeitszeitraum (notBefore und notAfter).

```bash
openssl x509 -in server.crt -dates -noout
```

`openssl x509 -in <cert> -fingerprint -sha256 -noout` — Zeigt den SHA-256-Fingerprint eines Zertifikats.

```bash
openssl x509 -in server.crt -fingerprint -sha256 -noout
```

`openssl x509 -in <cert> -serial -noout` — Zeigt die Seriennummer eines Zertifikats.

```bash
openssl x509 -in server.crt -serial -noout
```

`openssl x509 -in <cert> -ext subjectAltName -noout` — Zeigt die Subject Alternative Names (SANs) eines Zertifikats.

```bash
openssl x509 -in server.crt -ext subjectAltName -noout
```

## Entfernten Server prüfen

`openssl s_client -connect <host>:<port>` — Verbindet sich mit einem entfernten Server und zeigt den SSL/TLS-Handshake samt Zertifikatskette.

```bash
openssl s_client -connect example.com:443
```

`openssl s_client -connect <host>:443 -servername <host>` — Verbindet sich mit SNI (Server Name Indication) für virtuelle Hosts.

```bash
openssl s_client -connect example.com:443 -servername example.com
```

`openssl s_client -connect <host>:443 | openssl x509 -text -noout` — Holt das Zertifikat eines entfernten Servers und zeigt dessen Details an.

```bash
openssl s_client -connect example.com:443 </dev/null | openssl x509 -text -noout
```

`openssl s_client -connect <host>:443 -showcerts` — Zeigt die vollständige Zertifikatskette des Servers.

```bash
openssl s_client -connect example.com:443 -showcerts </dev/null
```

`openssl s_client -connect <host>:443 -status` — Prüft den OCSP-Stapling-Status des Server-Zertifikats.

```bash
openssl s_client -connect example.com:443 -status </dev/null
```

`openssl s_client -connect <host>:443 -tls1_3` — Erzwingt eine TLS-1.3-Verbindung, um die Protokoll-Unterstützung zu testen.

```bash
openssl s_client -connect example.com:443 -tls1_3
```

`openssl s_client -connect <host>:443 -cipher <cipher>` — Testet, ob eine bestimmte Cipher-Suite unterstützt wird.

```bash
openssl s_client -connect example.com:443 -cipher ECDHE-RSA-AES256-GCM-SHA384
```

## Schlüssel erzeugen

`openssl genrsa -out <key> <bits>` — Erzeugt einen privaten RSA-Schlüssel. Die Datei ist unverschlüsselt – schütze sie mit restriktiven Dateirechten (`chmod 600`).

```bash
openssl genrsa -out private.key 4096
```

`openssl genrsa -aes256 -out <key> <bits>` — Erzeugt einen mit Passphrase verschlüsselten privaten RSA-Schlüssel.

```bash
openssl genrsa -aes256 -out private.key 4096
```

`openssl ecparam -genkey -name prime256v1 -out <key>` — Erzeugt einen privaten ECDSA-Schlüssel auf der P-256-Kurve.

```bash
openssl ecparam -genkey -name prime256v1 -out ec-private.key
```

`openssl genpkey -algorithm ed25519 -out <key>` — Erzeugt einen privaten Ed25519-Schlüssel.

```bash
openssl genpkey -algorithm ed25519 -out ed25519.key
```

`openssl rsa -in <key> -pubout -out <pubkey>` — Extrahiert den öffentlichen Schlüssel aus einem privaten Schlüssel.

```bash
openssl rsa -in private.key -pubout -out public.key
```

`openssl rsa -in <key> -text -noout` — Zeigt die Komponenten eines RSA-Schlüssels in menschenlesbarer Form.

```bash
openssl rsa -in private.key -text -noout
```

`openssl rsa -in <encrypted_key> -out <decrypted_key>` — Entfernt die Passphrase von einem verschlüsselten privaten Schlüssel. Der Schlüssel liegt danach ungeschützt auf der Platte – nur in kontrollierten Umgebungen einsetzen.

```bash
openssl rsa -in encrypted.key -out decrypted.key
```

## Zertifikatsanträge (CSR)

`openssl req -new -key <key> -out <csr>` — Erzeugt einen CSR aus einem bestehenden privaten Schlüssel.

```bash
openssl req -new -key private.key -out server.csr
```

`openssl req -new -newkey rsa:4096 -nodes -keyout <key> -out <csr>` — Erzeugt privaten Schlüssel und CSR in einem Schritt. `-nodes` speichert den Schlüssel unverschlüsselt – nur in geschützten Umgebungen verwenden.

```bash
openssl req -new -newkey rsa:4096 -nodes -keyout server.key -out server.csr
```

`openssl req -in <csr> -text -noout` — Zeigt den Inhalt eines CSR.

```bash
openssl req -in server.csr -text -noout
```

`openssl req -verify -in <csr>` — Prüft die Signatur eines CSR.

```bash
openssl req -verify -in server.csr
```

`openssl req -new -key <key> -out <csr> -subj "/CN=<domain>"` — Erzeugt einen CSR nicht-interaktiv mit Subject-Zeile.

```bash
openssl req -new -key server.key -out server.csr -subj "/CN=example.com/O=My Company/C=DE"
```

`openssl req -new -key <key> -out <csr> -addext "subjectAltName=DNS:<domain>"` — Erzeugt einen CSR mit Subject Alternative Names (SANs).

```bash
openssl req -new -key server.key -out server.csr -addext "subjectAltName=DNS:example.com,DNS:www.example.com"
```

## Selbstsignierte Zertifikate

`openssl req -x509 -newkey rsa:4096 -nodes -keyout <key> -out <cert> -days <days>` — Erzeugt ein selbstsigniertes Zertifikat samt neuem Schlüssel in einem Schritt. Selbstsignierte Zertifikate nur für Tests oder interne Zwecke – Browser und Clients vertrauen ihnen nicht ohne manuelle Ausnahme.

```bash
openssl req -x509 -newkey rsa:4096 -nodes -keyout server.key -out server.crt -days 365
```

`openssl req -x509 -key <key> -in <csr> -out <cert> -days <days>` — Erstellt ein selbstsigniertes Zertifikat aus einem bestehenden CSR.

```bash
openssl req -x509 -key server.key -in server.csr -out server.crt -days 365
```

`openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout <key> -out <cert> -days 365 -subj "/CN=<domain>" -addext "subjectAltName=DNS:<domain>"` — Einzeiler für ein selbstsigniertes Zertifikat mit SAN (moderne Browser verlangen SANs).

```bash
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout server.key -out server.crt -days 365 -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
```

## Zertifikate konvertieren

`openssl x509 -in <cert.pem> -outform DER -out <cert.der>` — Konvertiert ein PEM-Zertifikat ins DER-Format (binär).

```bash
openssl x509 -in server.crt -outform DER -out server.der
```

`openssl x509 -in <cert.der> -inform DER -outform PEM -out <cert.pem>` — Konvertiert ein DER-Zertifikat ins PEM-Format.

```bash
openssl x509 -in server.der -inform DER -outform PEM -out server.pem
```

`openssl pkcs12 -export -out <pfx> -inkey <key> -in <cert> -certfile <ca>` — Erstellt eine PKCS#12-/PFX-Datei aus Schlüssel, Zertifikat und optionaler CA-Kette.

```bash
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile ca-chain.crt
```

`openssl pkcs12 -in <pfx> -out <pem> -nodes` — Extrahiert alle Zertifikate und Schlüssel aus einer PKCS#12-Datei. `-nodes` schreibt den Schlüssel unverschlüsselt.

```bash
openssl pkcs12 -in server.pfx -out server.pem -nodes
```

`openssl pkcs12 -in <pfx> -clcerts -nokeys -out <cert>` — Extrahiert nur das Client-Zertifikat aus einer PKCS#12-Datei.

```bash
openssl pkcs12 -in server.pfx -clcerts -nokeys -out cert.pem
```

`openssl pkcs12 -in <pfx> -nocerts -nodes -out <key>` — Extrahiert nur den privaten Schlüssel aus einer PKCS#12-Datei.

```bash
openssl pkcs12 -in server.pfx -nocerts -nodes -out key.pem
```

## Prüfung & Validierung

`openssl verify -CAfile <ca> <cert>` — Prüft ein Zertifikat gegen ein CA-Zertifikat.

```bash
openssl verify -CAfile ca.crt server.crt
```

`openssl x509 -in <cert> -noout -checkend <seconds>` — Prüft, ob ein Zertifikat innerhalb der angegebenen Sekunden abläuft.

```bash
openssl x509 -in server.crt -noout -checkend 2592000
```

`openssl rsa -in <key> -check` — Prüft die Konsistenz eines privaten RSA-Schlüssels.

```bash
openssl rsa -in private.key -check
```

`openssl x509 -in <cert> -modulus -noout | openssl md5` — Ermittelt den Modulus-Hash eines Zertifikats (zum Abgleich mit dem Schlüssel, ob beide zusammenpassen).

```bash
openssl x509 -in server.crt -modulus -noout | openssl md5
```

`openssl rsa -in <key> -modulus -noout | openssl md5` — Ermittelt den Modulus-Hash eines Schlüssels (muss zum Zertifikats-Modulus passen).

```bash
openssl rsa -in server.key -modulus -noout | openssl md5
```

## Hashing & Kodierung

`openssl dgst -sha256 <file>` — Berechnet den SHA-256-Hash einer Datei.

```bash
openssl dgst -sha256 document.pdf
```

`openssl dgst -md5 <file>` — Berechnet den MD5-Hash einer Datei. MD5 und SHA1 gelten als kryptografisch gebrochen – für Sicherheitszwecke SHA-256 verwenden.

```bash
openssl dgst -md5 document.pdf
```

`echo -n "<text>" | openssl dgst -sha256` — Hasht eine Zeichenkette mit SHA-256.

```bash
echo -n "hello" | openssl dgst -sha256
```

`openssl base64 -in <file>` — Base64-kodiert eine Datei.

```bash
openssl base64 -in image.png
```

`openssl base64 -d -in <file>` — Dekodiert eine Base64-kodierte Datei.

```bash
openssl base64 -d -in encoded.txt -out decoded.bin
```

## Ver- und Entschlüsselung

`openssl enc -aes-256-cbc -salt -pbkdf2 -in <file> -out <encrypted>` — Verschlüsselt eine Datei mit AES-256-CBC und Passwort.

```bash
openssl enc -aes-256-cbc -salt -pbkdf2 -in secret.txt -out secret.enc
```

`openssl enc -d -aes-256-cbc -pbkdf2 -in <encrypted> -out <decrypted>` — Entschlüsselt eine mit AES-256-CBC verschlüsselte Datei.

```bash
openssl enc -d -aes-256-cbc -pbkdf2 -in secret.enc -out secret.txt
```

`openssl rsautl -encrypt -inkey <pubkey> -pubin -in <file> -out <encrypted>` — Verschlüsselt eine kleine Datei mit einem öffentlichen RSA-Schlüssel.

```bash
openssl rsautl -encrypt -inkey public.key -pubin -in secret.txt -out secret.enc
```

`openssl rsautl -decrypt -inkey <privkey> -in <encrypted> -out <decrypted>` — Entschlüsselt eine Datei mit einem privaten RSA-Schlüssel.

```bash
openssl rsautl -decrypt -inkey private.key -in secret.enc -out secret.txt
```

`openssl rand -hex <bytes>` — Erzeugt Zufallsbytes als Hexadezimal-String.

```bash
openssl rand -hex 32
```

`openssl rand -base64 <bytes>` — Erzeugt Zufallsbytes als Base64-String.

```bash
openssl rand -base64 32
```

## Nützliche Abfragen

`openssl version` — Zeigt die installierte OpenSSL-Version.

```bash
openssl version -a
```

`openssl list -cipher-algorithms` — Listet alle verfügbaren Cipher-Algorithmen.

```bash
openssl list -cipher-algorithms
```

`openssl list -digest-algorithms` — Listet alle verfügbaren Digest-(Hash-)Algorithmen.

```bash
openssl list -digest-algorithms
```

`openssl ecparam -list_curves` — Listet alle unterstützten elliptischen Kurven.

```bash
openssl ecparam -list_curves
```

`openssl ciphers -v` — Listet alle unterstützten Cipher-Suites mit Protokollversionen.

```bash
openssl ciphers -v 'TLSv1.3'
```

`openssl speed <algorithm>` — Misst die Performance eines kryptografischen Algorithmus (Benchmark).

```bash
openssl speed aes-256-cbc sha256
```

<!-- PROSE:outro -->
## Fazit

OpenSSL ist auf nahezu jedem Server vorinstalliert und bleibt das Referenz-Werkzeug, wenn es um TLS und Kryptografie geht. Wer die `x509`-, `req`- und `s_client`-Unterkommandos beherrscht, diagnostiziert Zertifikatsprobleme in Sekunden und automatisiert PKI-Aufgaben in CI/CD-Pipelines. Halte dich an moderne Algorithmen (SHA-256, AES-256, Ed25519), meide MD5/SHA1 und schütze private Schlüssel konsequent – dann ist OpenSSL ein verlässlicher Begleiter.

## Weiterführende Links

- [OpenSSL — offizielle Dokumentation](https://docs.openssl.org/) – Referenz und Manpages (englisch)
- [OpenSSL-Projekt – openssl.org](https://www.openssl.org/docs/) – Projektseite und Dokumentations-Übersicht (englisch)
- [OpenSSL – Wikipedia](https://de.wikipedia.org/wiki/OpenSSL) – Hintergrund und Geschichte
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [age](https://www.jpkc.com/db/cheatsheets/security/age/) – moderne, einfache Datei-Verschlüsselung
- [clamav](https://www.jpkc.com/db/cheatsheets/security/clamav/) – Open-Source-Virenscanner
- [fail2ban](https://www.jpkc.com/db/cheatsheets/security/fail2ban/) – sperrt Angreifer-IPs anhand von Log-Mustern

