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