From vollkorn at cryptobitch.de Sat Aug 19 17:52:44 2017 From: vollkorn at cryptobitch.de (Jan Girlich) Date: Sat, 19 Aug 2017 17:52:44 +0200 Subject: =?UTF-8?Q?Schl=c3=bcssel_von_Keyserver_holen_und_nutzen_mit_Python-?= =?UTF-8?Q?Bindings?= Message-ID: <52a47dd6-0754-21d3-aac4-f80e6fae6268@cryptobitch.de> 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: : 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('') 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 From jochen at intevation.de Mon Aug 21 05:27:55 2017 From: jochen at intevation.de (Jochen Saalfeld) Date: Mon, 21 Aug 2017 05:27:55 +0200 Subject: =?UTF-8?B?U2NobMO8c3NlbA==?= von Keyserver holen und nutzen mit Python-Bindings In-Reply-To: <52a47dd6-0754-21d3-aac4-f80e6fae6268@cryptobitch.de> References: <52a47dd6-0754-21d3-aac4-f80e6fae6268@cryptobitch.de> Message-ID: <2426096.AJiisiXPW8@archimedes> Moin, On Saturday, August 19, 2017 5:52:44 PM CEST Jan Girlich wrote: > Wie kann ich mit encrypt() den Key nutzen, den ich mir gerade > heruntergeladen habe? Soweit ich das auf dem Schirm habe, muss der Key zunächst importiert werden, bevor du ihn wirklich verwenden kannst [1]. Ich denke, dass der Key erst im Context sein muss, bevor er verwendet werden kann [2]. Beste Grüße, Jochen [1] - https://www.gnupg.org/documentation/manuals/gpgme/Importing-Keys.html [2] - https://stackoverflow.com/a/29872131/2439667 -- jochen at intevation.de | intevation.de/ | 0541335083214 | PGPkey: 0x64B67DF4 Intevation GmbH, Neuer Graben 17, 49074 Osnabrueck - AG Osnabrueck, HR B 18998 Geschaeftsfuehrer: Frank Koormann, Bernhard Reiter, Dr. Jan-Oliver Wagner -------------- nächster Teil -------------- Ein Dateianhang mit Binärdaten wurde abgetrennt... Dateiname : signature.asc Dateityp : application/pgp-signature Dateigröße : 833 bytes Beschreibung: This is a digitally signed message part. URL : From vollkorn at cryptobitch.de Mon Aug 21 08:37:19 2017 From: vollkorn at cryptobitch.de (Jan Girlich) Date: Mon, 21 Aug 2017 08:37:19 +0200 Subject: =?UTF-8?Q?Re:_Schl=c3=bcssel_von_Keyserver_holen_und_nutzen_mit_Pyt?= =?UTF-8?Q?hon-Bindings?= In-Reply-To: <2426096.AJiisiXPW8@archimedes> References: <52a47dd6-0754-21d3-aac4-f80e6fae6268@cryptobitch.de> <2426096.AJiisiXPW8@archimedes> Message-ID: <7b398bec-03a6-5086-b880-8b5cfa35dca2@cryptobitch.de> Moin Jochen, Am 21.08.2017 um 05:27 schrieb Jochen Saalfeld: > On Saturday, August 19, 2017 5:52:44 PM CEST Jan Girlich wrote: >> Wie kann ich mit encrypt() den Key nutzen, den ich mir gerade >> heruntergeladen habe? > > Soweit ich das auf dem Schirm habe, muss der Key zunächst importiert werden, > bevor du ihn wirklich verwenden kannst [1]. Ich denke, dass der Key erst im > Context sein muss, bevor er verwendet werden kann [2]. genau das war mein Problem. So geht es: 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('') # Schlüssel vom Server in den Context importieren. c.op_import_keys([recipient_key]) encrypted_body, _, _ = c.encrypt( 'Testnachricht'.encode(), recipients=[sender_key, recipient_key], sign=True, always_trust=True) Vielen Dank Jan Girlich