web-dev-qa-db-fra.com

Comment vérifier qu'une signature gpg correspond à un fichier de clé publique?

Je sais comment utiliser gpg vérifier comme ceci:

$ 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

Mais ce que je veux vraiment faire, c'est vérifier le fichier par rapport à un fichier de clé publique spécifique.

La motivation fait partie d'un programme qui télécharge des fichiers volumineux à partir d'un site Web et doit vérifier qu'ils n'ont pas été falsifiés avant de les utiliser. Le site Web contiendra les fichiers et les signatures. Le programme sera livré avec la clé publique GPG. Lorsque je télécharge les fichiers sur le site Web, je les signe avec la clé privée correspondante (non distribuée évidemment). Il semble que le programme devrait être capable de faire quelque chose comme:

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

Mais gpg n'a pas d'option comme celle-ci. Il semble que la seule façon de le faire serait d'analyser la sortie imprimée de la commande gpg qui semble très dangereuse (elle contient du texte contrôlé par l'attaquant).

Edit: Je ne sais pas ce qu'est l'étiquette ici pour répondre à ses propres questions, mais la réponse que j'ai trouvée était d'utiliser le drapeau --status-fd. Ce drapeau génère une sortie bien analysable que je peux vérifier pour l'empreinte digitale souhaitée:

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

produit sur 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

C'est ainsi, par exemple, que fonctionne la bibliothèque GnuPG de Perl.

26
Rich

La seule façon d'utiliser un fichier de clé publique spécifique comme un trousseau de clés est si le fichier est au format de fichier GPG (OpenPGP) et non une version blindée ASCII (par exemple pubkey.gpg pas pubkey.asc ).

Donc, cela vérifiera le fichier:

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

Et cela ne va pas:

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

EDIT: Je suis entré dans un peu plus de détails à ce sujet pour une question similaire sur le site SuperUser:

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

18
Ben

Je suis venu avec le script suivant:

#!/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

utilisé comme:

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