ssh-keygen als Werkzeug zum signieren

von Markus Berger am Samstag, 9. April 2022

Einleitung

Um die Unversehrtheit einer Nachricht/Datei zu überprüfen zu können, kann man diese digital unterschreiben (signieren). Diese Signatur wird aus dem privaten Schlüssel des Senders und der Nachricht selbst vom Sender erstellt. Der Empfänger dieser Nachricht kann dann mit dem öffentlichen Schlüssel des Senders die Unversehrtheit prüfen. Klassisch wird hier gnupg oder ssl als Quelle der Schlüssel verwendet, was aber nicht immer zur Verfügung steht. Alternativ ist nun auch openssh in der Lage, die ssh-Schlüssel dafür zu verwenden. Dies ist sehr vorteilhaft, denn ssh ist quasi überall in der Standardinstallation vorhanden und der Schlüsselaustausch ist erprobt.

Vorbereitung

Als erstes benötigt man natürlich das Schlüsselmaterial. Dies lässt sich mit ssh-keygen -t ed25519 leicht erzeugen, bzw. kann natürlich das für die normale ssh Nutzung vorhandene Material verwendet werden.

Die Dateien werden, wenn nicht anders angegeben, im Verzeichnis .ssh des Heimatverzeichnisses des Nutzers erstellt.

ls .ssh

id_ed25519
id_ed25519.pub

Signieren

Für das Signieren wie auch später für das Überprüfen wird auch ssh-keygen verwendet. Im folgenden Script ist die Verwendung beispielhaft dargelegt.

#!/bin/sh

if [ $# -ne 2 ]; then
    echo "$0 privkey file"
    exit 1
else
    ssh-keygen -Y sign -f "$1" -n file "$2"
fi

Es werden zwei Parameter erwartet:

Hier ein Beispiel:

./sshsign ~/.ssh/id_ed25519 ~/eine_datei

Nach dem der Aufruf erfolgt ist, wird eine neue Datei mit der Endung .sig und dem ursprünglichen Dateipfad und Namen erzeugt. Im Fall des Beispiels also ~/eine_datei.sig.

Diese beiden Dateien können nun dem Empfänger zur Verfügung gestellt werden und dieser kann die Echtheit mit unseren öffntlichen Schlüssel überprüfen.

Überprüfen der Signatur

Um die Signatur überprüfen zu können, ist noch etwas Vorbereitungsarbeit auf der Empfängerseite notwendig, denn es muss eine Datei vorhanden sein, wo die zulässigen Unterzeichner von Nachrichten mit ihren öffentlichen Schlüsseln hinterlegt sind. Als Beispiel verwenden wir hier die Datei ~/.ssh/allowed_signers. Der Aufbau ist einfach und auch in den man-Seiten von ssh-keygen mit Beispielen beschrieben.


cat ~/.ssh/allowed_signers

# ein Komentar
alice@local.local ssh-ed25519 AAAA...

Im Prinzip steht hier eine Zuordnung: Name öffentlicher Schlüssel. Mit dem folgenden Script kann nun die Echtheit überprüft werden.

#!/bin/sh

if [ $# -ne 2 ]; then
    echo "$0 email content-file"
    exit 1
else
    ssh-keygen -Y verify -f ~/.ssh/allowed_signers -I "$1" -n file -s "$2.sig" < "$2"
fi

Auch hier sind zwei Parrameter nötig:

Das Script erwartet auch die Datei mit der Signatur an dem Ort, wo die eigentliche Datei zu finden ist, das sie den gleich Namen trägt und die Endung .sig hat.

Hier wieder ein Beispiel:

./sshverify alice@local.local ~/eine_datei

Je nach dem ob die Signatur gültig ist oder nicht, kommt nun die passende Nachricht.