Öffentliche Schlüssel und Signaturen
Die wichtigsten Befehle zum Merken
openssl pkeyutl -sign— mit einem privaten Schlüssel signieren.openssl pkeyutl -verify— mit dem öffentlichen Schlüssel prüfen.
Befehle und Optionen
| Befehl oder Option | Bedeutung |
|---|---|
mktemp -d |
Privates temporäres Verzeichnis erstellen; signature_lab=$(…) speichert den Pfad. |
genpkey -algorithm ED25519 -out DATEI |
Einen entbehrlichen privaten Ed25519-Schlüssel erzeugen. |
pkey -in DATEI -pubout -out DATEI |
Den öffentlichen Schlüssel exportieren. |
pkeyutl -sign / -verify |
Die Eingabe signieren / prüfen. |
-rawin -inkey DATEI -in DATEI |
Nachrichtenbytes mit Ed25519 verwenden und Schlüssel sowie Nachricht wählen. |
-pubin / -sigfile DATEI |
Öffentlichen Schlüssel lesen / Signatur zur Prüfung wählen. |
printf '…\n' > DATEI |
Text samt Zeilenumbruch in die Beispieldatei schreiben. |
rm / rmdir |
Benannte Beispieldateien / leeres Verzeichnis entfernen. |
Anführungszeichen erhalten Pfade. > ersetzt nur die Testnachricht. Der unverschlüsselte private Schlüssel ist keine Produktionszugangsdatei.
Die entscheidenden Konzepte
1. Ein Schlüsselpaar hat getrennte Rollen
Ein privater Schlüssel ermöglicht Operationen mit geheimem Besitznachweis. Der passende öffentliche Schlüssel darf zur Prüfung geteilt werden. Ed25519 ist hier ein Signaturverfahren, kein Verschlüsselungsverfahren.
Der öffentliche Schlüssel muss in diesem Modell nicht geheim bleiben. Der private schon: Sein Besitzer kann unter dem öffentlichen Schlüssel akzeptierte Signaturen erzeugen.
2. Eine Signatur authentifiziert Bytes, nicht Bedeutung
Eine digitale Signatur prüft, ob bestimmte Bytes mit dem passenden privaten Schlüssel signiert wurden und unverändert blieben. Sie verschlüsselt nicht und beweist keine Wahrheit des Inhalts.
Ein korrekt signierter schädlicher Befehl bleibt schädlich. Autorisierung muss entscheiden, ob der Signierer die Aktion verlangen darf. Die Anwendung muss den Inhalt sicher interpretieren.
3. Die exakte Darstellung zählt
Andere Zeilenumbrüche, Kodierungen, Feldreihenfolgen oder Bytes ändern die signierte Eingabe, sofern kein kanonisches Format vereinbart ist. JSON signieren und anders formatiertes JSON prüfen kann deshalb scheitern.
Das Signaturverfahren übernimmt seine kryptografischen Schritte. Ergänze keinen beliebigen Hash oder Kodierungsschritt, den die Gegenseite nicht erwartet. Beide Seiten brauchen dasselbe definierte Verfahren.
4. Die Prüfung braucht einen authentischen öffentlichen Schlüssel
Ein Angreifer kann ein eigenes Paar erzeugen und eine Ersatznachricht signieren. Akzeptierst du auch seinen ersetzten öffentlichen Schlüssel, gelingt die Prüfung.
Entscheidend ist daher die Herkunft des Prüfschlüssels: Zertifikatskette, festgelegte Konfiguration oder andere authentifizierte Verteilung. Kryptografische Gültigkeit und vertrauenswürdige Signiereridentität sind getrennte Prüfungen.
Ein kleines Beispiel
Optional: Führe die Zeilen einzeln im selben Bash-Terminal aus. Nach erfolgreichem Verzeichnisaufbau geht es bis zum Aufräumen weiter, auch nach der absichtlich fehlgeschlagenen zweiten Prüfung.
signature_lab=$(mktemp -d)
openssl genpkey -algorithm ED25519 -out "$signature_lab/key.pem"
openssl pkey -in "$signature_lab/key.pem" -pubout -out "$signature_lab/public.pem"
printf 'hello\n' > "$signature_lab/message.txt"
openssl pkeyutl -sign -rawin -inkey "$signature_lab/key.pem" -in "$signature_lab/message.txt" -out "$signature_lab/signature.bin"
openssl pkeyutl -verify -rawin -pubin -inkey "$signature_lab/public.pem" -in "$signature_lab/message.txt" -sigfile "$signature_lab/signature.bin"
printf 'changed\n' > "$signature_lab/message.txt"
openssl pkeyutl -verify -rawin -pubin -inkey "$signature_lab/public.pem" -in "$signature_lab/message.txt" -sigfile "$signature_lab/signature.bin"
rm "$signature_lab/key.pem" "$signature_lab/public.pem" "$signature_lab/message.txt" "$signature_lab/signature.bin"
rmdir "$signature_lab"
Die erste Prüfung sollte für die ursprünglichen Bytes gelingen. Nach Ersetzen der Nachricht sollte sie mit Fehlerstatus scheitern. Das sind zu prüfende Erwartungen, keine erfassten Ergebnisse. Scheitern Erzeugung oder Signieren, kläre zuerst diesen Fehler.
Die letzten zwei Zeilen entfernen beide Schlüssel, Nachricht, Signatur und leeres Verzeichnis normalerweise ohne Ausgabe. Vertrauensspeicher und vorhandene Schlüssel bleiben unverändert.
Merke dir: Eine Signatur verbindet Bytes und Schlüssel. Dessen Vertrauen und erlaubte Verwendung musst du separat prüfen.