Fünfmal kreativer Einsatz von openssl

Als Anwender kennt man OpenSSL vor allem als freie Verschlüsselungsschicht für TCP/IP-Verbindungen — ist man Administrator eines Web- oder Mailservers, denkt man eher an das Kommandozeilentool openssl, mit dem Zertifikate erstellt und signiert werden. Doch gerade das CLI-Werkzeug ist mächtiger, als manch einer denkt und kann ideal für viele Anwendungen jenseits des Zertifikate-Managements verwendet werden.

1. SSL-Verbindungen testen

Relativ nah am üblichen Einsatzzweck liegt die Möglichkeit, mit einem simplen Client zu testen, ob ein Server korrekt SSL anbietet oder in den TLS-Modus umschaltet, wenn dies angefordert wird. Am einfachsten geht dies bei einem SSL-gesicherten Webserver, der auf dem Standard-Port 443 lauscht:

openssl s_client -connect mail.rootserverexperiment.de:443

Der s_client wird nun das Zertifikat anzeigen und gegebenenfalls auf Probleme hinweisen, ein “Verify return code” zeigt gegebenenfalls selbst signierte Zertifikate an. Ist das Zertifikat durch, besteht die Möglichkeit, beispielsweise GET-Sequenzen abzusetzen um Webseiten anzufordern.

Ein wenig aufwendiger ist die Kontaktaufnahme mit einem SMTP-Server. Mit diesem wird zunächst Klartext gesprochen, bevor die Anweisung zur Verwendung einer verschlüsselten Verbindung gegeben wird. Auch den Schritt, TLS zu starten, übernimmt openssl mit einem zusätzlichen Schalter:

openssl s_client -connect mail.rootserverexperiment.de:25 -starttls smtp

Nachdem man die Zertifikate betrachtet hat, kann man hier — wie bei Telnet oder Netcat bei unverschlüsselten Verbindungen üblich, die Kommunikation mit SMTP-Befehlen fortsetzen:

EHLO whitehouse.gov
MAIL FROM: george@whitehouse.gov
RCPT TO: mattias@rootserverexperiment.de
...

Der geneigte Admin erkennt schnell: Mit diesem Test ist sichergestellt, dass nicht nur das Zertifikat selbst in Ordnung ist, sondern dieses auch richtig in die Konfiguration des Servers eingebunden wurde (Zugriffsrechte, Pfade). Schlampigkeiten bei der Installation des Zertifikates werden so flott identifiziert.

2. Prüfsummen erstellen

Nicht auf jedem Rechner, auf dem man gerade unterwegs ist, stehen die gängigen Werkzeuge zum Erstellen und Checken von Prüfsummen bereit. Ist OpenSSL installiert, kann dieses verwendet werden um praktisch alle gängigen “Message Digests” zu erstellen. Die (kollisionsfreudige) MD5 zum Beispiel

openssl md5 /tmp/test.bin

oder den eher exotischen RMD160:

openssl rmd160 /tmp/test.bin

3. Dateien verschlüsseln

Verschlüsselung auf die Schnelle? Kein Problem mit OpenSSL! Zumindest symetrische Algorithmen beherrscht das Kommandozeilenwerkzeug perfekt. Das reicht, um eine Datei mit einem Passwort zu versehen und weiterzugeben. Das Passwort kann auf der Kommandozeile übergeben werden. Lässt man es weg, öffnet OpenSSL einen Passwort-Prompt — hier die Verschlüsselung mit 256Bit-AES:

openssl enc -aes256 -k 'Ganz geheimes Passwort' -in datei.txt -out datei.crypt

Der Empfänger (welcher das Passwort auf einem sicheren Weg erhalten hat) kann dann mit dem zusätzlichen Schalter -d die Entschlüsselung starten:

openssl enc -aes256 -d -in datei.crypt -out datei.txt

Diese Form der symetrischen Verschlüsselung hat natürlich den Nachteil, dass der Schlüssel auf Sender- und Empfängerseite bekannt sein muss. Sie taugt daher nicht dazu, bspw. auf einem Server die Logdateien täglich zu verschlüsseln und sie so für Angreifer unbrauchbar zu machen — schließlich ist das Passwort irgendwo im Klartext gespeichert oder es lässt sich schlimmstenfalls über die Prozessliste auslesen. Dafür eignet sich die symetrische Verschlüsselung dafür, Dateien für den Versand an Linux nutzende Empfänger vorzubereiten, die sonst mit Verschlüsselung wenig am Hut haben: OpenSSL ist immer installiert, das Passwort kann am Telefon übergeben werden und die Entschlüsselung ist leicht zu verstehen.

4. Dateien Base64-kodieren

Ganz praktisch ist auch die Möglichkeit, Dateien für dem Versand per Email oder den Einbau in selbst extrahierende Shell-Scripte Base64 zu kodieren. Die Umwandlung einer unverschlüsselten Datei Datei in eine Base64 kodierte entspricht weitgehend der Verschlüsselung, weshalb ich auf auf die Dekodierung nicht weiter eingehe:

openssl base64 -in test.bin -out test.b64

Ein sehr schönes Feature ist jedoch die Möglichkeit, eine Datei zu verschlüsseln und anschließend Base64 zu kodieren, hierbei ist bei der Verschlüsselung und Entschlüsselung der zusätzliche Schalter -a notwendig:

openssl enc -aes256 -k 'Ganz geheimes Passwort' -a -in datei.txt -out datei.crypt.b64

Wofür Sie diese Funktion verwenden, ist Ihnen überlassen — Sinn macht sie beispielsweise beim direkten Versand per Pipeline einer Datei via Mail (einfach den Parameter -out weglassen) oder beim Einbetten binärer und verschlüsselter Daten in Shellscripte.

5. Passwort-Hashes generieren

Haben Sie schoneinmal mit einer 32Bit-Rettungs-CD oder einem 32Bit-Rettungssystem einen Rechner zu reparieren versucht, auf dem ein 64Bit-Linux läuft. Spätestens beim chroot in die gemountete Festplatte des havarierten Systems wird klar, dass die übliche Methode, das Rootpasswort mit passwd zu setzen fehlschlägt. Hier hilft openssl. Mit dem Subkommando passwd entsteht ein Passwort-Hash, der in die Datei /etc/shadow eingetragen werden kann. Der bei Linux übliche MD5-Hash erfordert einen zusätzlichen Parameter:

openssl passwd -1

Passwort-Hashes werden auch bei anderen Anwendungen benötigt: Viele Blogsysteme speichern Hashes für Zugangspasswörter in der Datenbank und Apache vertraut in seinen .htpasswd-Dateien ebenfalls auf MD5-Hashes. opensslbeherrscht natürlich noch andere Hashes, im Zweifel hilft nur ausprobieren.

Alle hier gezeigten Beispiele stammen mehr oder weniger unverändert aus der Manual-Page von openssl beziehungsweise den separaten Manualpages von enc und s_client. Sollten diese auf Ihrem System nicht installiert sein, verwenden Sie die Links um direkt zu den Original-Manualpages zu gelangen.