Integration von GnuPG in MUAs



Ähnliche Dokumente
Anleitung Thunderbird Verschlu sselung

Enigmail Konfiguration

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Objektorientierte Programmierung für Anfänger am Beispiel PHP

11. Das RSA Verfahren und andere Verfahren

Informatik für Ökonomen II HS 09

Professionelle Seminare im Bereich MS-Office

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

Programmierkurs Java

Netzsicherheit I, WS 2008/2009 Übung 12. Prof. Dr. Jörg Schwenk

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Thunderbird Portable + GPG/Enigmail

GnuPG für Mail Mac OS X 10.4 und 10.5

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Bernd Blümel. Verschlüsselung. Prof. Dr. Blümel

Objektorientierte Programmierung

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Ein Hinweis vorab: Mailkonfiguration am Beispiel von Thunderbird

Anleitung zur Installation von Thunderbird

10. Kryptographie. Was ist Kryptographie?

Anleitung über den Umgang mit Schildern

FlowFact Alle Versionen

Beschreibung und Bedienungsanleitung. Inhaltsverzeichnis: Abbildungsverzeichnis: Werkzeug für verschlüsselte bpks. Dipl.-Ing.

-Verschlüsselung

Memeo Instant Backup Kurzleitfaden. Schritt 1: Richten Sie Ihr kostenloses Memeo-Konto ein

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Sie werden sehen, dass Sie für uns nur noch den direkten PDF-Export benötigen. Warum?

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Digital signierte Rechnungen mit ProSaldo.net

Handbuch für Nutzer von Zertifikaten der Zertifizierungsstellen (CAs) des Bayerischen Behördennetzes (BYBN) zur Sicherung von s Teil D7:

Leichte-Sprache-Bilder

SSH Authentifizierung über Public Key

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

1 topologisches Sortieren

Planung für Organisation und Technik

Guide DynDNS und Portforwarding

Zwischenablage (Bilder, Texte,...)

Primzahlen und RSA-Verschlüsselung

Sichere für Rechtsanwälte & Notare

E-Government in der Praxis Jan Tobias Mühlberg. OpenPGP. Brandenburg an der Havel, den 23.

So erstellen Sie nützliche Beschreibungen zu Ihren Tradingdaten

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

How to install freesshd

OP-LOG

Beschreibung Regeln z.b. Abwesenheitsmeldung und Weiterleitung

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Terminabgleich mit Mobiltelefonen

Import des persönlichen Zertifikats in Outlook 2003

Man liest sich: POP3/IMAP

Sichere s. Kundeninformation zur Verschlüsselung von s in der L-Bank

Hilfe zur Urlaubsplanung und Zeiterfassung

vorab noch ein paar allgemeine informationen zur d verschlüsselung:

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Das Handbuch zu KNetAttach. Orville Bennett Übersetzung: Thomas Bögel

Schritt-für-Schritt-Anleitung So verschlüsseln Sie Ihr -Konto in der Software 6.0

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

@GIT Initiative zur Standardisierung von Telemedizin. Empfehlung für ein standardisiertes Telemedizin/ -radiologie Übertragungsformat via

Urlaubsregel in David

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Fragen und Antworten zu Secure

Erstellen von x-y-diagrammen in OpenOffice.calc

Wie Sie beliebig viele PINs, die nur aus Ziffern bestehen dürfen, mit einem beliebigen Kennwort verschlüsseln: Schritt 1

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Inhalt. Inhalt Voraussetzungen Liegenschaften und Adressen auswählen Abgleich mit Internet-Office Dokumente...

Kundeninformationen zur Sicheren

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Handbuch zu Kontact für den Systemverwalter. Allen Winter

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

Import des persönlichen Zertifikats in Outlook Express

Datenbanken Kapitel 2

Anwendungsbeispiele Sign Live! Secure Mail Gateway

Übungen Programmieren 1 Felix Rohrer. Übungen

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003

Second Steps in eport 2.0 So ordern Sie Credits und Berichte

Serviceanweisung Austausch Globalsign Ausstellerzertifikate

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Lizenzen auschecken. Was ist zu tun?

Einstellen der Makrosicherheit in Microsoft Word

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Einfache kryptographische Verfahren

Artikel Schnittstelle über CSV

Unsere Webapplikation erweitern

Handbuch für Nutzer von Zertifikaten der Zertifizierungsstellen (CAs) des Bayerischen Behördennetzes (BYBN) zur Sicherung von s Teil D2:

1 Mathematische Grundlagen

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

SEPA Lastschriften. Ergänzung zur Dokumentation vom Workshop Software GmbH Siemensstr Kleve / /

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

Outlook und Outlook Express

Selbstdatenschutz. -Inhalte schützen. Verschlüsselung mit GPGTools for Mac. Was ist GPGTools? Woher bekomme ich GPGTools?

Nachrichten- Verschlüsselung Mit S/MIME

20. Algorithmus der Woche Online-Algorithmen: Was ist es wert, die Zukunft zu kennen? Das Ski-Problem

Lineare Gleichungssysteme

Erste Vorlesung Kryptographie

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Internationales Altkatholisches Laienforum

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Transkript:

Integration von GnuPG in MUAs Werner Koch Version 0.7 14. Februar 2001 1 Übersicht Da GnuPG im wesentlichen in Verbindung mit Email benutzt wrd, ist eine gute Integration mit MUAs (Mail User Agents) essentiell. Hier kann auf die Erfahrung mit der Integration von PGP 2 zurückgegriffen werden; insbesondere wurde das Interface von GnuPG in einer Art und Weise definiert, die eine Integration in andere Programme relativ leicht möglich macht. Besondere Kommandozeilenoptionen unterstützen den Programmierer hier. Wir geben hier eine schnelle und einfache Anleitung, um es dem Entwickler einer MUA einfach zu machen, GnuPG Unterstützung einzubauen. Wir werden kurz au die Geschichte derartiger Implementierungen eingehen, Vor- und Nachteile einiger Techniken diskutieren und dann eine sinnvolle Arbeitsweise diskutieren. 2 Protokolle Das von GnuPG unterstützte Protokoll ist OpenPGP, welches auf den Formaten von PGP 2 aufbaut. Es ist im RFC2440[3] definiert. Allerdings sagt dieses Protokoll nichts zur Verwendung in Email aus und man hat hierzu auf weitere Protokolle zurückzugreifen. Traditionell wurde das in OpenPGP definierte ASCII Armor Encoding direkt auch von Email Programmen benutzt, wobei hier ein MIME-Typ application/pgp-encrypted benutzt wird. Dieses sehr simple Protokoll hat jedoch einige entscheidende Nachteile, insbesondrs ist es nicht moglich eine Mail aus mehreren Teilen (Attachments) zusammenzusetzen. Aus diesem Grund und wegen einiger weiterer Probleme, sollte es möglichst nicht benutzt werden. Wenn möglich sollte ein MUA dieses ASCII Armor Format allerdings verstehen; dieses Format zu erzeugen is zu vermieden. Basierend auf dem MIME Standard[5] wurde das MOSS Protokoll[6] entworfen, welches die Basis für den RFC2015[2] (MIME Security wth Pretty Good Pri- wk@gnupg.org 1

vacy) darstellt. Dieses Protokoll sollte unbedingt zur Anwendung kommen. Im Weiteren wird es auch als PGP/MIME bezeichnet. PGP/MIME definiert 2 Protokolltypen: PGP Encrypted Data und PGP Signed Data. Beide können auch kombiniert werden. Hier eine kurze Darstellung der Funktionsweise Details sind dem RFC2015[2] zu entnehmen. PGP Encrypted Data ist eine MIME Multipart Message mit 2 Teilen in einem Content-Type von multipart/encrypted mit dem Parameter protocol="application/pgp-encrypted". Der erste Teil hat nun den Content-Type application/pgp-encrypted und besteht lediglich aus einer Zeile mit dem String Version: 1. Der zweite Teil hat den Content-Type application/octet-stream und besteht aus der OpenPGP ASCII Armored Nachricht. Der Plaintext dieser Nachricht ist nun ein normaler MIME Body und kann durchaus auch wieder eine Multipart Message sein. PGP Signed Data ist etwas komplizierter, da wir hier sicherstellen müssen, daß die Nachricht auf dem Transport nicht verändert wird. Details hierzu sind wiederum im RFC2015[2] zu finden. Es handelt sich auch hier um eine MIME Multipart Message mit 2 Teilen. Die gesamte Nachricht hat den Content-Type von multipart/signed mit dem Parameter protocol="application/pgp-signature". Der erste Teil stellt die eigentliche Nachricht dar und kann eine beliebiges Mime Objekt sein. Dieses gesamte Objekt wird signiert. Oft handelt es sich bei diesem Objekt dann auch um ein Multipart Object welches die eigentliche Nachricht mit ihren Attachments darstellt. Der zweite Teile hat den Content-Type application/pgp-signature und beinhalted eine Detached Signature im Textmodus als OpenPGP ASCII Armor. Als Besonderheit muß der Haupt MIME Content-Type noch den Parameter micalg=foo enthalten, wobei foo hier durch den verwendeten Hash Algorithmus zu ersetzen ist. Unter OpenPGP macht dieser Parameter allerdings wenig Sinn (er stammt aus dem MOSS Framework) und sollte von Anwedungen zwar korrekt gesetzt werden, ansonsten ist er aber zu ignorieren. 3 Historische Verfahren zur GnuPG Integration Ursprünglich wurde GnuPG, genau wie PGP in MUAs integriert, wobei nur wenig Kommunikation zwischen den Programmen bestand. Aufgrund unterschiedlicher Kommandzeileninterfaces musste GnuPG getrennt von PGP implementiert werden. Der MUA Mutt geht seiniger Zeit eine anderen Weg: Dort können die Aufrufe des Backends (PGP oder GnuPG) vom Anwender konfigiertert werden und intern werden sie identische behandelt. Um eine Liste der Public Keys zu erhalten, verwendet Mutt intern das Format von GnupG und liefert einen Wrapper für PGP mit, der dessen Ausgaben in das GnuPG Format wandelt. Das Problem mit all diesen Anwendung ist die eingschränkte Kommunikation, die man erreichen kann. Um eine benutzerfreundlichere Kommuniation mit PGP/GnuPG aufzubauen (z.b. Eingabe der Passphrase) ist ein recht hoher Aufwand notwendig, der in jedem MUA immer wieder neu implementiert werden muss. 2

4 GPGME als vereinheitlichte Schnittstelle Um die Integration einfacher zu machen, wurde die Bibliothek GPGME entwickelt, die eine Abstraktion der GnuPG Schnittstelle implementiert und eine High-Level Schnittstelle für MUAs und andwere Anwendungen anbietet. Diese Bibliotehk sollte unbedingt verwendet werden. Sie unterliegt der GPL[4], so daß Programme die sie nutzen GPL kompatiblen Lizenzen zu unterliegen haben 1. 5 Vorraussetzungen für einen MUA Um einen MUA mit GnuPG zu verheiraten, muss dieser unbedingt MIME unterstützen. Es gibt verschiede Techniken, MIME zu implementieren und dadurch ändert sich dann auch die Art und Weise, wie GnuPG/GPGME zu benutzen ist. Die einfachste (aber auch Resourcen intensivste) Integration ist gegeben, wenn auf die MIME Objekte wahlfrei zugegriffen werden kann und es möglich ist ein MIME Objekt durch ein anderes zu ersetzen. Fast alle heutigen MUAs arebite nach diesem Prinzip. Wir beschreiben im Folgenden ein derartiges System. wobei die Es wird dringend empfohlen, signieren und verschlüsseln auf MIME Ebene zu trennen und nicht die optionale kombinierte Methode anzuwenden (GPGME unterstützt diese momentan auch noch nicht). Der Vorteil ist die übesichtlichere Implementation und die Möglichkeit eine verschlüsselte Nachricht entschlüsselt zu archivieren, die Signatur dabei aber intakt zu lassen. 6 Entschlüsselung Die Entschlüsselung ist durchzufühen, sobald ein OpenPGP verschlüsseltes Objekt zur Verarbeitung ansteht. Es ist also zu prüfen, ob der Content-Type multipart/encrypted vorliegt und ein Parameter protocol="application/pgp-encrypted" vorhanden ist. Es sollte hierfür ein entsrpechender Handler implementiert werden. Es sollte nun geprüft werden, ob der erste Teil den richtigen Content-Type besitzt und eine Zeile mit der richtigen Versionsnummer vorhanden ist. Danach wird der zweite Teil via GPGME entschlüsselt und das daraus entstehende MIME Objekt ersetzt dann das ursprüngliche Objekt. Hier ein Beispiel ohne jegliche Fehlerbehandlung: GpgmeCtx ctx; GpgmeData ciphertext, plaintext; gpgme_new (&ctx); gpgme_data_new_from_mem (&ciphertext, mime_part_2, mime_part_2_len, TRUE ); gpgme_data_new (&plaintext); gpgme_op_decrypt (ctx, ciphertext, plaintext); 1 falls ich dies in Einzelfällen als Problem herausstellt, sollte der Autor von GPGME kontaktiert werden 3

gpgme_data_release(ciphertext); gpgme_data_rewind (plaintext); while (!gpgme_data_read (dh, buf, sizeof buf, &nread ) ) { fwrite (buf, nread, 1, stdout ); gpgme_release (ctx); gpgme_data_release(plaintext); ciphertext und plaintext enhalten jeweils die vollständigen MIME Objekte. Beispiele hierzu finden sich im RFC2015[2]. 7 Verschlüsselung Eine Verschlüsselung durchzuführen ist prinzipiell recht einfach, wird allerdings dadurch erschwert, daß hier ein UI benötigt wird, welches es erlaubt die Keys der Empfänger auszuwählen. Dies ist ein recht komplexes Thema und wir können hier nicht darauf eingehen. Als Eingabedaten wird eine Liste der Empfanger benötigt, sowie ein MIME Objekt. Das einfachste MIME Objekt hat den Content-Type text/plain, es ist aber auch jegliches andere MIME Objekt möglich. Hier der Beispielcode ohne jegliche Fehlerbehandlung, der eine vollständige RFC822[1] Mail ausgibt. GpgmeCtx ctx; GpgmeData ciphertext, plaintext; GpgmeRecipients rset; gpgme_new (&ctx); gpgme_set_armor (ctx, 1); gpgme_data_new_from_mem (&plaintext, mime_object, mime_object_len, TRUE ); err = gpgme_data_new ( &ciphertext ); gpgme_recipients_new (&rset); gpgme_recipients_add_name (rset, "Bob");, gpgme_op_encrypt (ctx, rset, plaintext, ciphertext ); gpgme_data_release (plaintext); gpgme_recipients_release (rset); print_mail_headers_without_content_lines (); fputs ( "Content-Type: multipart/encrypted;\r\n" " protocol=\"application/pgp-encrypted\";\r\n" " boundary=\"42=.42=.42=.42\"\r\n" "\r\n--42=.42=.42=.42\r\n" "Content-Type: application/pgp-encrypted\r\n\r\n" "Version: 1\r\n 4

"\r\n--42=.42=.42=.42\r\n" "Content-Type: application/octet-stream\r\n\r\n", stdout ); gpgme_data_rewind (ciphertext); while (!gpgme_data_read (ciphertext, buf, sizeof buf, &nread ) ) { fwrite (buf, nread, 1, stdout ); fputs ( "\r\n--42=.42=.42=.42--\r\n", stdout ); gpgme_release (ctx); gpgme_data_release(plaintext); print mail headers without content lines sollte alle notwendigen Mail Header mit der Ausnahme der Content-*: Zeilen ausgeben. Die Content Zeilen dürfen nicht mit ausgegeben werden, da diese von obigem Coder erzeugt werden. Normalerweise ist es möglich eine existierende Mail zu verschlüsseln, indem die alten Header gespeichert werden, die Content Header benutzt werden um das MIME Objekt zu bilden und dann die obigen Operationen durchgeführt werden. 8 Prüfung einer Signatur Die Signatur kann geprüft werden, wenn ein OpenPGP signiertes Objekt vorhanden ist. Ein solches Objekt identifiziert sich durch einen Content-Type multipart/signed und dem dazugehörgen Parameter protocol="application/pgp-signed". Der Parameter micalg kann bei der Benuztung von GPGME ignoriert werden. Es sollte hierfür ein entsprechender MIME Handler implementiert werden. Ein derartiges Objekt besteht aus 2 MIME Teilen: Dem signierten Teil, der ein beliebiges MIME Objekt sein kann, und dem Signatur Teil der den Content-Type application/pgp-signature hat. Beide Teile werden extrahiert und GPGME zur Prüfung zugeführt. Die MIME Header des ersten Teils sind mit signiert und müssen deswegen auch an GPGME weitergegeben werden. Beim 2. Teil kann dies gemacht werden, da GPGME diese Header ignoriert. Hier ein Beispiel ohne jegliche Fehlerbehandlung: GpgmeCtx ctx; GpgmeSigStat Status; GpgmeData datapart, sigpart; const char *nota_xml; gpgme_new (&ctx); gpgme_data_new_from_mem (&datapart, mime_part_1, mime_part_1_len, TRUE ); gpgme_data_new_from_mem (&sigpart, mime_part_2, mime_part_2_len, TRUE ); gpgme_op_verify (ctx, sigpart, datapart, &status); gpgme_data_release(datapart); gpgme_data_release(sigpart); 5

show_status (status); show_extended_status (ctx) nota_xml = gpgme_get_notation (ctx); if (nota_xml) show_notation_data (nota_xml); gpgme_release (ctx); Beispiele zu den MIME Objekten finden sich im RFC2015[2]. show status kann lediglich anzeigen, ob die Signatur gültig ist oder nicht und das auch nur wenn es sich um eine einzelne Signatur handelt. Sind mehrere Signaturen mit einem unterschiedlichen Status vorhanden, so wird lediglich ein besonderes Statuswert zurückgegeben. Bessere Informationen wird die oben angedeutete Funktion show extended status liefern; diese könnte so aussehen: int idx; GpgmeSigStat status; time_t created; for (idx=0; gpgme_get_sig_status(ctx, idx, &status, &created); idx++ ) { const char *userid = \"[?]\"; GpgmeKey key = NULL; if (!gpgme_get_sig_key (ctx, idx, &key) ) userid = gpgme_key_get_string_attr (key, GPGME_ATTR_USERID, NULL, 0); printf ("%s from \"%s\"\n", status_to_string(status), userid ); gpgme_key_unref (key); Falls Notation Daten vorhanden sind, so wereden sie als ein XML String für alle Signaturen geliefert. Weitere Informationen über den Key können entweder mittels der obigen Funktion oder aber durch gpgme key get as xml ermittelt werden. 9 Signieren Die Erzeugung einer Signatur hat grosse Ähnlichkeit mit dem Verschlüsseln. Ein beliebiges MIME Objekt kann signiert werden. Die Vorgehensweise wir Anhand eines Beispiels recht klar; in diesem Beispiel wird ein vorliegendes MIME Objekt in ein signiertes Objekt umgewandelt und auf stdout ausgegeben. Fehlerbehandlung und die Wahl einer sinnvollen Boundary fehlen hier. GpgmeCtx ctx; GpgmeData data, sig; gpgme_new (&ctx); gpgme_set_armor (ctx, 1); 6

gpgme_set_textmode (ctx, 1); gpgme_data_new_from_mem (&data, mime_object, mime_object_len, TRUE ); gpgme_data_new ( &sig ); gpgme_op_sign (ctx, data, sig, GPGME_SIG_MODE_DETACH ); fputs ( "Content-Type: multipart/signed;\r\n" " protocol=\"application/pgp-signature\";\r\n" " boundary=\"42=.42=.42=.42\"\r\n" "\r\n--42=.42=.42=.42\r\n", stdout ); gpgme_data_rewind (data); while (!gpgme_data_read (data, buf, sizeof buf, &nread ) ) { fwrite (buf, nread, 1, stdout ); fputs ( "\r\n--42=.42=.42=.42--\r\n" "Content-Type: application/pgp-signature\r\n\r\n", stdout); gpgme_data_rewind (sig); while (!gpgme_data_read (sig, buf, sizeof buf, &nread ) ) { fwrite (buf, nread, 1, stdout ); fputs ( "\r\n--42=.42=.42=.42--\r\n", stdout ); gpgme_release (ctx); gpgme_data_release(data); gpgme_data_release(sig); RFC2015[2] und dessen bald erscheinende Überarbeitung definieren noch einige sinnvolle Transformationen des MIME Objekts; z.b. sollten trailing white spaces entfernt werden und die Zeilen mit kanonischen Zeilentrennern (CR,LF) versehen sein. 10 Ausblick Auf die Behandlung von Passphrases ist hier bewusst nicht eingegangen worden, da angestrebt wird, dieses von Anwendungen fernzuhalten und durch eine eigene Software, die direkt mit GnuPG zusammenarbeitet, zu lösen. Die hier beschriebene Schnittstelle ist so allgemein gehalten, das sie in Zukunft auch um andere Verschlüsselungsstandards erweitert werden kann. Neue Versionen dieses Dokuments werden von Zeit zu Zeit erscheinen. 7

Literatur [1] D. Crocker. Standard for the format of arpa internet text messages, August 1982. [2] M. Elkins. RFC 2015: MIME security with pretty good privacy (PGP), October 1996. [3] J. Callas et al. RFC 2440: OpenPGP message format, November 1998. [4] Free Software Foundation. GNU General Public License, version 2, June 1991. [5] N. Freed and N. Borenstein. Multipurpose internet mail extensions (mime) part one: Format of internet message bodies., November 1996. [6] J. Galvin, S. Murphy, S. Crocker, and N. Freed. RFC 1847: Security multiparts for mime: Multipart/signed and multipart/encrypted, October 1995. 8