Tipp: OpenSSL - Erstellen von Zertifikaten aus bestehenden Zertifikaten
Im Zusammenhang mit dem Heartbleed Bug in OpenSSL müssen die Privaten Schlüssel und Zertifikate der Server ausgetauscht werden, da es durch eine geschickte Nutzung des Bugs möglich ist den Privaten Schlüssel auszulesen und zur Entschlüsselung der per https übertragenen Daten genutzt werden.
Erster Schritt ist das Erzeugen eines neuen Privaten Schlüssels.
user@linux ~ $ openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
......................................................+++
.................................................................+++
e is 65537 (0x10001)
Der so erstellte Private Schlüssel ist neu und damit unabhängig von dem bisher genutzten Privaten Schlüssel. Damit der Schlüssel genutzt werden kann wird nun das Zertifikat benötigt. Wir gehen davon aus, dass das Zertifikat von einem Trustcenter stammt und müssen daher eine Zertifikatanfrage (CSR) erstellen.
Normalerweise würden wir dafür openssl req
benutzen und alle Daten per Hand angeben.
Ein sehr viel einfacherer Weg ist das bestehende Zertifikat zu benutzen und die Daten
daraus zu kopieren.
user@linux ~ $ openssl x509 -x509toreq -in server_old.crt -out server.csr -signkey server.key
Getting request Private Key
Generating certificate request
Die hierbei genutzte Datei server_old.crt
enthält das bisherige Zertifikat. Alle
Informationen aus diesem Zertifikat sind die Grundlage für die Zertifikatanfrage
(server.csr
).
user@linux ~ $ openssl req -in server.csr -text
Certificate Request:
Data:
Version: 0 (0x0)
Subject: CN=linux-essentials.de
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
[...]
OpenSSL - Gehören Zertifikat und Key zusammen?
Im täglichen Einsatz kann es immer mal wieder vorkommen, dass Dateien oder Daten an sich durcheinander gewürfelt sind. Passiert dies bei Zertifikat-Schlüsseln oder -Zertifikaten ist dies besonders schlimm, da sie dann nicht mehr eingesetzt werden können.
Der erste Test, der durchgeführt werden kann ist der der Test auf einen gemeinsamen ‘Modulus’. Dieser Wert kann mit dem Programm openssl
aus dem Schlüssel und Zertifikat entnommen werden
user@linux ~ $ openssl rsa -in server.key -modulus -noout
Modulus=B47B5B80CC8D443569A1C6D0144F19E36882DB4CE9B056DB3C72A95F0040954F344C7CBB45039CAA32CD2BE4C54A9B5BC3AEBA6731EAFB567DBDB8F97F3942D007A6A0CF0A4E26C6D7B720C6C7A752BDDD5566785D44FC2287F91B7C724C151D1753A06BE77069497ECD3B80BF0F3B08E5DA416957EB94871188C1BCF92E3612CC5CD4D8BEAECEE793E69A403038B101DF2B3F0FF230D19DE44FC0CE37BC6CC05A72864BCA44ADA48E1F5C05446F7B27130DF263CE341C713A0457EFC4E1D2093292466261631E855003B56F70B4C635D9B5B9131B66A6FFE7627C7770BF81BE8E7EE1077781E134A8A45F2AE39DA8717078F8AE44D8BB8519EED223EF3AA4F3
Der Parameter -modulus
ist für die Ausgabe des Modulus zuständig. Durch die Ergänzung um -noout
wird die Ausgabe des Schlüssels unterdrückt.
Nun der Aufruf für das Zertifikat.
user@linux ~ $ openssl x509 -in server.crt -modulus -noout
Modulus=B47B5B80CC8D443569A1C6D0144F19E36882DB4CE9B056DB3C72A95F0040954F344C7CBB45039CAA32CD2BE4C54A9B5BC3AEBA6731EAFB567DBDB8F97F3942D007A6A0CF0A4E26C6D7B720C6C7A752BDDD5566785D44FC2287F91B7C724C151D1753A06BE77069497ECD3B80BF0F3B08E5DA416957EB94871188C1BCF92E3612CC5CD4D8BEAECEE793E69A403038B101DF2B3F0FF230D19DE44FC0CE37BC6CC05A72864BCA44ADA48E1F5C05446F7B27130DF263CE341C713A0457EFC4E1D2093292466261631E855003B56F70B4C635D9B5B9131B66A6FFE7627C7770BF81BE8E7EE1077781E134A8A45F2AE39DA8717078F8AE44D8BB8519EED223EF3AA4F3
Der optische Vergleich zeigt, dass die beiden ein und den selben Modulus haben und damit die gleiche Grundlage. Lässt man von den Ausgaben der beiden Programme jeweils einen Hash mit z. B. sha1sum
generieren wird dies noch deutlicher.
user@linux ~ $ openssl rsa -in server.key -modulus -noout | sha1sum
33f256bf0c70c63cc2d362f3022437f688139b4e -
user@linux ~ $ openssl x509 -in server.crt -modulus -noout
33f256bf0c70c63cc2d362f3022437f688139b4e -
Will man 100 Prozent sicher sein, dann signiert man einen Text mit dem Schlüssel und lässt dann prüfen ob der Text mitels des Zertifikats verifizierbar ist.
user@linux ~ $ echo "Test-Text" | openssl sha1 -sign server.key -sha1 > signed.bin
user@linux ~ $ openssl x509 -pubkey -noout -in server.crt > server.pub
user@linux ~ $ echo "Text-Text" | openssl dgst -verify server.pub -signature signed.bin
Verified OK
Dieser Mechanismus ist ein wenig schwieriger, da zuerst der Text, in diesem Fall “Test-Text”, signiert werden muss und die Signatur in signed.bin
abgelegt wird. Danach extrahieren wir aus dem Zertifikat den Öffentlichen Schlüsselanteil und speichern es in server.pub
. Da nun alles vorliegt können wir den gleichen Text über den Öffentlichen Schlüssel und die Signatur prüfen lassen. Gehören der Private und der Öffentliche Schlüssel – somit auch das Zertifikat – zusammen wird “Verified OK” als Meldung ausgegeben.