it-swarm.com.de

Wie überprüfe ich, ob eine gpg-Signatur mit einer öffentlichen Schlüsseldatei übereinstimmt?

Ich weiß, wie man gpg benutzt.

$ gpg --verify somefile.sig
gpg: Signature made Tue 23 Jul 2013 13:20:02 BST using RSA key ID E1B768A0
gpg: Good signature from "Richard W.M. Jones <[email protected]>"
gpg:                 aka "Richard W.M. Jones <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: F777 4FB1 AD07 4A7E 8C87  67EA 9173 8F73 E1B7 68A0

Was ich aber wirklich tun möchte, ist, die Datei anhand einer bestimmten öffentlichen Schlüsseldatei zu überprüfen.

Die Motivation ist Teil eines Programms, das große Dateien von einer Website herunterlädt und überprüfen muss, ob sie nicht manipuliert wurden, bevor es sie verwendet. Die Website enthält die Dateien und die Signaturen. Das Programm wird mit dem öffentlichen GPG-Schlüssel ausgeliefert. Wenn ich die Dateien auf die Website hochlade, signiere ich sie mit dem entsprechenden privaten Schlüssel (nicht offensichtlich verteilt). Es scheint, dass das Programm in der Lage sein sollte, Folgendes zu tun:

gpg --no-default-keyring --verify file.sig \
    --is-signed-with /usr/share/program/goodkey.asc

Aber gpg hat keine solche Option. Es sieht so aus, als ob die einzige Möglichkeit darin besteht, die gedruckte Ausgabe des Befehls gpg zu analysieren, was sehr unsicher erscheint (er enthält vom Angreifer gesteuerten Text).

Bearbeiten: Ich weiß nicht, was die Etikette für die Beantwortung eigener Fragen ist, aber die Antwort, die ich gefunden habe, war die Verwendung des Flags --status-fd. Dieses Flag generiert eine gut analysierbare Ausgabe, die ich auf den gewünschten Fingerabdruck überprüfen kann:

gpg --status-fd <N> --verify file.sig

produziert auf fd N:

[GNUPG:] SIG_ID rpG8ATxU8yZr9SHL+VC/WQbV9ac 2013-07-23 1374582002
[GNUPG:] GOODSIG 91738F73E1B768A0 Richard W.M. Jones <[email protected]>
[GNUPG:] VALIDSIG F7774FB1AD074A7E8C8767EA91738F73E1B768A0 2013-07-23 1374582002 0 4 0 1 2 00 F7774FB1AD074A7E8C8767EA91738F73E1B768A0
[GNUPG:] TRUST_UNDEFINED

So funktioniert zum Beispiel die GnuPG-Bibliothek von Perl.

26
Rich

Die einzige Möglichkeit, eine bestimmte öffentliche Schlüsseldatei wie einen Schlüsselbund zu verwenden, besteht darin, dass die Datei im GPG-Dateiformat (OpenPGP) vorliegt und keine gepanzerte ASCII -Version (z. B. pubkey.gpg, nicht pubkey.asc).

So wird die Datei überprüft:

gpg --no-default-keyring --keyring /path/to/pubkey.gpg --verify /path/to/file.txt.gpg

Und das wird nicht:

gpg --no-default-keyring --keyring /path/to/pubkey.asc --verify /path/to/file.txt.gpg

EDIT: Ich habe auf eine ähnliche Frage auf der SuperUser-Site näher eingegangen:

https://superuser.com/questions/639853/gpg-verifying-signatures-without-creating-trust-chain/650359#650359

18
Ben

Ich habe mir folgendes Skript ausgedacht:

#!/bin/bash

set -e

keyfile=$(mktemp --suffix=.gpg)
function cleanup {
    rm "$keyfile"
}
trap cleanup EXIT

gpg2 --yes -o "$keyfile" --dearmor "$1"
gpg2 --status-fd 1 --no-default-keyring --keyring "$keyfile" --trust-model always --verify "$2" 2>/dev/null

benutzen als:

$ check-sig.sh <ascii-armored-keyfile> <signature-document>
10
zbyszek