Programmgesteuertes Ermitteln, wer von GPG eine Datei signiert hat

5

Ich möchte programmgesteuert ermitteln, wer eine GPG-Clear-Sign-Datei signiert hat. Laufen gpg --verify Ich werde es Ihnen mitteilen, aber in einem für Menschen lesbaren Format. Ist es möglich, dieses Ergebnis in einem maschinenlesbaren Format zu erhalten?

Ich suche keine Methoden zum Parsen des für Menschen lesbaren Formats, da es sich in zukünftigen GPG-Versionen ändern könnte. Ich brauche eine robuste Lösung.

jornane
quelle
Was genau ist für Sie der Unterschied zwischen lesbar und maschinenlesbar? Ehrlich gesagt muss in jedem Fall ein Parser geschrieben werden. Es scheint trivial zu sein, die von diesem Befehl zurückgegebenen Daten zu analysieren.
Ramhound
1
@Ramhound: Der Unterschied besteht darin, dass die von Menschen lesbaren Ausgaben je nach Programmversion, Systemsprache, Datumsformat, Gebietsschema (Zeichensatz) variieren. Der Parser müsste daher um ein Vielfaches komplexer sein.
grawity
@grawity - In Ordnung. Meine Aussage war zu sehen, ob ich Klarheit bekommen könnte, damit die Frage klar ist. Ich könnte problemlos einen Parser generieren, alles, was Sie auflisten, würde für alles, was ich schrieb, gleich bleiben.
Ramhound
1
Zum Beispiel die keybase-client Code zuerst versuchte zu analysieren das für Menschen lesbare Format, musste jedoch die Zeitzonen berücksichtigen (die Ausgabe enthält die Ortszeit); unterschiedliche Informationsmengen zwischen den Versionen ("beliebig viele Zeilen überspringen"); Benutzereinstellungen (lange vs kurze vs 0xlong vs 0xshort Schlüssel-IDs) ... Der neue Code ist ungefähr gleich groß, aber einfacher zu verstehen, erhält mehr Informationen und es wird mehr oder weniger versprochen, dass das Ausgabeformat erhalten bleibt gleich.
grawity
Mit anderen Worten, es ist eine Wahl zwischen dem Schreiben von robustem Code und "kein Fehler, es funktioniert auf MEINEM Computer".
grawity

Antworten:

11

Dafür hat GnuPG das maschinenlesbare --status-fd Format:

^ gpg --status-fd=1 --verify test.asc
gpg: Signature made Sat 01 Feb 2014 19:37:53 EET using RSA key ID C1B52632
[GNUPG:] SIG_ID LI0kgmtHFCacIrSKM9uxpc3B2jI 2014-02-01 1391276273
[GNUPG:] GOODSIG D24F6CB2C1B52632 Mantas Mikulėnas <[email protected]>
gpg: Good signature from "Mantas Mikulėnas <[email protected]>"
gpg:                 aka "Mantas Mikulėnas <[email protected]>"
[GNUPG:] NOTATION_NAME [email protected]
[GNUPG:] NOTATION_DATA 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632
[GNUPG:] VALIDSIG 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632 2014-02-01 1391276273                        0 4 0 1 2 00 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632
[GNUPG:] TRUST_ULTIMATE

Das Ausgabeformat ist in dokumentiert doc / DETAILS . (Die Nachrichten sind mit für Menschen lesbaren Nachrichten vermischt, weil ich darauf hingewiesen habe gpg zu fd # 1, alias stdout. Ein Programm könnte für diesen Zweck leicht zwei getrennte FDS verwenden, z. mit pipe().)

grawity
quelle
Vielen Dank! Ich habe rumgespielt --with-colons das hat die ganze zeit nicht geklappt.
jornane
Hinweis für sich selbst und andere Interessierte: --with-colons ist nützlich zum Parsen der Schlüsselausgabe, z --list-keys.
jornane