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

je sais comment utiliser gpg verify 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 <rjones@redhat.com>"
gpg:                 aka "Richard W.M. Jones <rich@annexia.org>"
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 à clé publique spécifique.

la motivation est dans le cadre d'un programme qui télécharge de gros fichiers à partir d'un site web et a besoin de vérifier qu'ils n'ont pas été altérés avant qu'il ne les utilise. Le site web contiendra les fichiers et les signatures. Le programme sera envoyé avec la clé publique GPG. Quand je télécharge les fichiers vers le site web Je vais les signer avec la clé privée correspondante (pas distribué évidemment). Il semble que le programme devrait pouvoir faire quelque chose comme:

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

mais gpg n'a pas le choix. 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 quelle est l'étiquette par 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 lisible que je peux vérifier pour l'empreinte digitale désiré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 <rjones@redhat.com>
[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.

21
demandé sur Jens Erat 2013-09-25 21:06:32

2 réponses

la seule façon d'utiliser un fichier à clé publique spécifique comme un porte-clés est si le fichier est dans le format de fichier GPG (OpenPGP) et non une version blindée ASCII (par exemple pubkey.gpg pas pubkey.ncp).

donc ceci vérifiera le fichier:

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

et ce ne sera pas:

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

EDIT: j'ai 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

11
répondu Ben 2017-03-20 10:18:24

j'ai trouvé le script suivant:

#!/bin/bash

set -e

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

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

utiliser comme:

$ check-sig.sh <ascii-armored-keyfile> <signature-document>
10
répondu zbyszek 2015-10-31 15:24:52