Hlavní navigace

Enigform: OpenPGP rozšíření pro Mozilla Firefox

25. 5. 2007
Doba čtení: 6 minut

Sdílet

Možnosti šifrování a podepisování elektronické pošty pomocí OpenPGP (GnuPG a PGP) jistě není nutno čtenářům Root.cz představovat. Řada z nás má nainstalováno rozšíření Enigmail pro Mozilla Thunderbird. Co ale OpenPGP a HTTP? Co takhle pomocí OpenPGP podepisovat webové formuláře nebo autentizovat uživatele?

Úvod

Řada z nás OpenPGP technologie denně používá, ať již vědomě nebo i nevědomě (automatické ověřování elektronických podpisů při instalaci nebo aktualizaci systémů). Už dávno se nejedná o technologii vhodnou pouze pro odborníky na příkazovou řádku. Existuje celá řada grafických nadstaveb. I běžná sekretářka dokáže pomocí OpenPGP elektronicky podepsat svou poštu, stačí ji jen ukázat, na které tlačítko má kliknout.

S/MIME versus OpenPGP

Pokud se rozhodneme podepisovat, případně šifrovat svou elektronickou poštu, můžeme si obvykle vybrat jednu ze dvou možnosti. Tou první je S/MIME, jenž je běžnými poštovními klienty standardně podporováno. Druhou možností je OpenPGP. S podporou OpenPGP je to poněkud složitější a obvykle je nutno OpenPGP rozšíření pro daného poštovního klienta někde stáhnout a doinstalovat.

Co použít záleží především na tom, s kým si chceme dopisovat. Ne vždy je ale dohoda možná. Co se stane, když někam na státní správu odešlu vyplněný formulář podepsaný pomocí OpenPGP? Pokud se vůbec něco stane, bude výsledek stejný jako kdybych odeslal vyplněný formulář bez elektronického podpisu. Pokud si chci dopisovat se státem, musím se přizpůsobit, tj. musím použít S/MIME a kvalifikovaný certifikát. Kvalifikovaný certifikát lze získat u certifikačních autorit schválených (akreditovaných) státem. Vztahy důvěry jsou tak definovány státem. Stát věří certifikační autoritě a já jí musím věřit také. Vydání kvalifikovaného certifikátu není zadarmo a jeho platnost je nutné obnovovat, jinak řečeno opět platit.

Můžeme si vytvořit vlastní certifikační autoritu, stanovit vlastní pravidla a vydávat vlastní certifikáty. Chceme-li bezpečně komunikovat s někým, kdo nevyžaduje S/MIME s přísně stanovenými vztahy důvěry (PKI), můžeme použít OpenPGP a veřejně klíče si bezpečně vyměnit (ať už přímo nebo pomocí pavučiny důvěry). Pro bezpečnou komunikaci opravdu nepotřebujeme certifikační autority, kvalifikované certifikáty a PKI.

HTTPS versus OpenPGP

Stejně jako poštovní komunikaci (SMTP, POP3) lze relativně snadno odposlouchávat případně i pozměňovat také webovou komunikaci (HTTP). Místo HTTP lze používat HTTPS, kdy jsou data šifrována pomocí SSL nebo TLS. Webový server se představí svým certifikátem podepsaným certifikační autoritou. Uživatel, ve skutečnosti webový prohlížeč, se rozhodne, zda lze dané certifikační autoritě věřit. Pokud certifikační autoritě věřím, mohu předpokládat, že opravdu komunikuji se zamýšleným serverem. Má ale webový server jistotu, že komunikuje opravdu se mnou? Jak moc dbáme na bezpečnost? Je pro nás autentizace uživatele pomocí jména a hesla dostatečná? Co když se nám někdo dívá přes rameno? Co když někdo nainstaloval na náš počítač software, jenž zaznamenává stisky všech kláves (keylogger)?

Autentizovat uživatele lze samozřejmě opět pomocí certifikátů. Narážíme zde ale na stejné problémy jako u elektronické pošty. Kdo bude vystavovat certifikáty? Na kterou certifikační autoritu budeme oba spoléhat? Budu vyžadovat kvalifikované certifikáty a nutit uživatele k jejich zakoupení?

Proč prostě a jednoduše nepodepisovat přenášená data pomocí OpenPGP? Veřejný klíč uložím na webovém serveru, svým soukromým klíčem daný formulář podepíšu a klidně odešlu i pomocí HTTP, vždyť pokud by záškodník přenášená data pozměnil, webový server by to ověřením elektronického podpisu zjistil.

Enigform

Jak prosté, někoho to ale musí napadnout a někdo to musí také implementovat. Tvůrcem rozšíření Enigform pro Mozilla Forefox je pětadvacetiletý Argentinec Arturo „Buanzo“ Busleiman. Ve svém článku na freshmeat.net píše, že se přibližně před rokem ve tři ráno náhle probudil a hlavou se mu honily pouze myšlenky na „BEGIN PGP“ a „GET /“. Tenkrát ho napadlo, že by HTTP požadavky mohly být podepisovány pomocí OpenPGP. Webový server nebo aplikace na něm běžící by si mohly ověřovat, zda požadavek nebo data opravdu pocházejí od správného uživatele. Chtěl to vše hned promyslet a prodiskutovat. U své manželky však nenašel pro svůj objev ve tři ráno pochopení (vůbec se nedivím), tak si své myšlenky tenkrát jenom poznamenal a šel opět spát. O deset měsíců později se rozhodl své myšlenky implementovat a vytvořil rozšíření Enigform. První verze uměla pracovat pouze s HTTP POST. POST data byla prostě vyňata, podepsána a vrácena zpět. Na straně webového serveru byla podepsaná data vyjmuta, byl ověřen podpis a data předána aplikaci. Problém byl samozřejmě s webovými servery, které podepsaná POST data vůbec neočekávaly. Aplikace samozřejmě přestaly fungovat, protože z formulářů získávaly pouze pro ně nesrozumitelná data.

Později Arturo „Buanzo“ Busleiman kontaktoval pracovní skupinu IETF OpenPGP a bylo mu řečeno, že OpenPGP podepisování je implementováno v diskusních skupinách (news) pomocí dalších položek v hlavičce. Rozšíření Enigform bylo tedy přepsáno a dnešní verze přidává do standardní HTTP hlavičky další položky. Webový server a aplikace podporující OpenPGP mohou potřebná data získat z HTTP hlavičky. Webový server a aplikace, které o existenci OpenPGP vůbec netuší jednoduše pro ně neznámé položky v HTTP hlavičce ignorují.

Normální http požadavek, předání údaje z formuláře:

    * Host = enigformtest.buanzo.com.ar
    * User-Agent = Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070424 BonEcho/2.0.0.3
    * Accept = text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    * Accept-Language = en-us,en;q=0.5
    * Accept-Encoding = gzip,deflate
    * Accept-Charset = ISO-8859-1,utf-8;q=0.7,*;q=0.7
    * Keep-Alive = 300
    * Connection = keep-alive
    * Referer = http://enigformtest.buanzo.com.ar/
    * Content-Type = application/x-www-form-urlencoded
    * Content-Length = 16
    * X-Auth-OpenPGP = false

Tentýž požadavek, tentokrát ale OpenPGP podepsaný pomocí Enigform (X-OpenPGP-*):

    * Host = enigformtest.buanzo.com.ar
    * User-Agent = Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070424 BonEcho/2.0.0.3
    * Accept = text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    * Accept-Language = en-us,en;q=0.5
    * Accept-Encoding = gzip,deflate
    * Accept-Charset = ISO-8859-1,utf-8;q=0.7,*;q=0.7
    * Keep-Alive = 300
    * Connection = keep-alive
    * Referer = http://enigformtest.buanzo.com.ar/
    * X-OpenPGP-Type = S
    * X-OpenPGP-Sig-Fields = body
    * X-OpenPGP-Sig = iD8DBQFGVGmpxNd3hwNeF68RAu6TAKDxoqihOU1NiTp9OoXX1YmHPx+MoQCfU+8V41z7kLtCMml1Z8/bgh7HwPo==JLsV
    * X-OpenPGP-Digest-Algo = SHA1
    * X-OpenPGP-Version = GnuPG v1.4.7 (GNU/Linux)
    * X-OpenPGP-Agent = Enigform 0.8.0 for Mozilla Firefox
    * Content-Type = application/x-www-form-urlencoded
    * Content-Length = 16
    * X-Auth-OpenPGP = false

Instalace Enigform

Instalace rozšíření Enigform je stejná jako instalace jiných rozšíření do Mozilla Firefox, stačí kliknout na příslušný xpi odkaz. Stabilní verzi lze získat přímo z oficiálního serveru doplňku pro Mozilla produkty (Add-ons). Vývojovou verzi lze získat z webových stránek projektu Enigform.

e2
e1

Práce s Enigform

K vyzkoušení Enigform doporučuji navštívit testovací stránku. Jedná se o jednoduchý PHP skript (enigformtest­.tgz) testující GET a POST funkcionalitu společně s výpisem užitečných ladících informací.

e3

Přihlašování do webových aplikací pomocí OpenPGP a Enigform lze vyzkoušet na další testovací stránce (Smutty – Enigform Demo Login). Serveru stačí předat přihlašovací jméno a veřejný OpenPGP klíč a hned se můžete zkusit přihlásit. Zdrojové kódy jsou samozřejmě také k dispozici (PHP framework Smutty).

root_podpora

e4

Trocha historie

Jak už to bývá, spojení HTML s OpenPGP (tenkrát ještě PGP) bylo navrhnuto už dávno před vznikem Enigform. Webové stránky mohou být podepsány viditelně (PGP signed web-pages), mohou začínat „-----BEGIN PGP SIGNED WEB-PAGE-----“ a končit „-----END PGP SIGNATURE-----“ . Nebo také pro uživatele skrytě. Podpis je uložen ve zdrojovém kódu stránky jako poznámka (Digital signing of Web pages with PGP). Problém je, že zatím nebyla implementována (nebyla vyžadována) podpora na straně webového prohlížeče. Pokud si uživatel chce u takové stránky ověřit podpis autora, musí si jí lokálně uložit a následně ručně spustit PGP/GnuPG z příkazové řádky.

Příště se podíváme na serverovou část. Ukážeme si, jak mohou webové aplikace zpracovat požadavky podepsané pomocí Enigform. Nainstalujeme si a nakonfigurujeme modul mod_auth_openpgp do webového serveru Apache.

Kdybyste právě teď měli odeslat podepsaný mail, tj. máte nakonfigurovaného poštovního klienta, stačí pouze kliknout na tlačítko nebo stisknout kombinaci kláves, mohli byste jej podepsat pomocí:

Byl pro vás článek přínosný?