Schlüssel von Keyserver holen und nutzen mit Python-Bindings
Jan Girlich
vollkorn at cryptobitch.de
Sa Aug 19 17:52:44 CEST 2017
Moin,
ich versuche die Python-Bindings von GPGME zu benutzen. Mein Ziel ist es
ausgehend von einer Key-ID eine verschlüsselte Mail zu senden.
Meine Idee ist also erst die Mode des Contexts auf EXTERN zu stellen,
dann mit get_key() den Schlüssel zu holen und anschließend mit encrypt()
den Mail-Body zu verschlüsseln.
Ich erwarte, dass encrypt das anstandslos macht, aber es wird eine
InvalidRecipients-Exception geworfen:
Invalid Recipients: <redacted fingerprint>: No public key
Was könnte ich hier falsch machen?
Mein Code (Python 3):
import gpg
with gpg.Context(armor=True) as c:
c.set_engine_info(gpg.constants.PROTOCOL_OpenPGP,
home_dir='~/mytestdir/')
# Privaten Signatur-Schlüssel aus lokalem Schlüsselring holen
sender_key = c.get_key(settings.GPG_HOST_USER)
# Umstellen auf EXTERN um Empfänger-Schlüssel von Server zu
# holen
gpg.core.gpgme.gpgme_set_keylist_mode(c.wrapped,
gpg.constants.KEYLIST_MODE_EXTERN)
recipient_key = c.get_key('<key id>')
encrypted_body, _, _ = c.encrypt(
'Testnachricht'.encode(),
recipients=[sender_key, recipient_key],
sign=True, always_trust=True)
Wenn ich den Code ausführe dauert es eine Weile und ich kann den
Netzwerk-Traffic sehen. Ich kann mir auch im Debugger den Key in
recipient_key anschauen. Es scheint mir, dass der Key sauber vom Server
geholt wird.
In der letzten Zeile fliegt die Exception:
[Stacktrace in meinem Code]
[...]
File
"/home/jan/Projekte/AA/env/lib/python3.5/site-packages/gpg/core.py",
line 276, in encrypt
raise errors.InvalidRecipients(result.invalid_recipients)
gpg.errors.InvalidRecipients: 9E01C5D77041D0C4804F470576216606231D96D8:
No public key
Es fühlt sich so an als würde versucht werden den Schlüssel dann doch
wieder aus dem lokalen Keyring zu holen. Also habe ich testweise den Key
per Kommandozeile in meinen Test-Ring importiert. Dann funktioniert der
obige Code auch.
Wie kann ich mit encrypt() den Key nutzen, den ich mir gerade
heruntergeladen habe?
Installiert:
libgpgme-dev_1.8.0-3ubuntu2_amd64.deb
libgpgme11_1.8.0-3ubuntu2_amd64.deb
gnupg-agent_2.1.11-6ubuntu2_adm64.deb
pip:
gpg (1.8.0) - Python bindings for GPGME GnuPG
cryptography library
INSTALLED: -VERSION-
LATEST: 1.8.0
~/.gnupg/gpg-agent.conf
default-cache-ttl 300
max-cache-ttl 999999
allow-loopback-pinentry
~/mytestdir/gpg.conf
keyserver hkp://keys.gnupg.net
Gruß
Jan
Mehr Informationen über die Mailingliste Gnupg-de