QuickTipp: 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.