PGP - Pretty Good Privacy

Z HelpDesk

Pretty Good Privacy (česky bychom řekli dost dobré soukromí) je balík programů, který umožňuje šifrovat a dešifrovat soubory, digitálně je podepisovat, ověřovat identitu odesílatele a spravovat klíče. Na tato stránka je věnována pužívání PGP z příkazové řádky.

Informace jak používat PGP v poštovním klientu Mozilla Thunderbird, včetně postupu instalace, jsou na samostatné stránce věnované rozšíření Enigmail.

Paní Jiřina se někdy nezdá ...

Základní informace o PGP

Základní rozdíl mezi PGP a PKI je v přístupu ověřování majitele veřejného klíče - PKI využívá centrální certifikační autoritu (organizace má vlastní certifikační autoritu nebo využívá služeb třetí strany), zatímco PGP je založeno na decentralizovaných certifikačních autoritách, kdy každý uživatel PGP může vystupovat jako certifikační autorita. Každý z přístupů má své výhody, PGP je využíváno zejména uživateli, kteří nemají přístup k centrální certifikační autoritě nebo potřebují bezpečně komunikovat s lidmi, jejichž certifikační autoritě nedůvěřují.

Jak funguje PGP a další podrobné údaje lze nalézt například na stránkách http://cs.wikipedia.org nebo http://www.pgpi.org/.

Pavučina důvěry
Ověření majitele veřejného klíče je možné buď přímo (osobně ověřená identita a fingerprint) nebo nepřímo, když identitu ověřil někdo jiný považovaný za důvěryhodného. Pokud takováto důvěryhodná osoba důvěřuje někomu dalšímu, můřemu mu také důvěřovat. Prakticky lze různým lidem důvěřovat různě, proto je míra důvěry odstupňovaná (nevím, nevěřím, částečně věřím, úplně věřím). Pavučina důvěry zachycuje tyto závislosti a umožňuje vyhodnocovat míru důvěry pro veřejné klíče uživatelů, které ověřil někdo jiný.

PGP party
Všechny certifikační autority vždy musí ověřit komu vydávají certifikáty. Chce-li uživatel PGP podepsat něčí veřejný klíč, stává se také certifikační autoritou a musí si tedy ověřit komu daný veřejný klíč patří. Pro takovéto účely jsou pořádány tzv. PGP party.

Běžný průběh takovéto party je následující. Každý z účastníků si na PGP party přinese své údaje (KEY-ID, KEYNAME a FINGERPRINT) vytištené na papíru. Potom každý účastník postupně obejde všechny ostatní účastníky a vymění si navzájem papíry se svými údaji přičemž si podle nějakého dokladu ověří totožnost. Na konci PGP party všichni odchází s balíčkem údajů o cizích klíčích.

Teprve po návratu ke svému počítači proběhne vlastní akt podpisu veřejných klíčů.

GPG - GNU Privacy Guard

GNU Privacy Guard (GnuPG nebo GPG) je svobodná alternativa k PGP, vydaná pod GNU General Public License. K dispozici je pro většinu operačních systémů. Další informace o PGP lze nalézt například na stránkách http://www.gpg.cz/ nebo http://cs.wikipedia.org/wiki/GNU_Privacy_Guard

Instalace

V linuxových distribucích je GnuPG obvykle jako samostatný balíček, instalace je následující:

apt-get install gnupg

Pro některé další operační systémy (např. Windows) je potřeba instalační balíček stáhnout z adresy http://www.gnupg.org/download/ a spustit instalaci.

Běžné operace s GnuPG

Následující operace jsou ty nejběžněji používané.

Vytvoření PGP klíče

Vytvoření páru (privátní a veřejný) klíčů je prováděno příkazem

gpg --gen-key

Je dobré vybrat si délku klíče minimálně 2048 bitů a expiraci nastavit na nikdy. Klíčovou frázi je potřeba si pamatovat, protože tato znalost je vyžadována při podepisování a dalších činnostech. Výsledkem je výstup např.

pub 1024D/BCB88B92 2007-05-10 Ales Padrta <apadrta@civ.zcu.cz>
    Key fingerprint = 6328 6BF1 6835 AC7F BF8B  F756 D8DB 958F BCB8 8B92
sub 2048g/07B6F0B9 2007-05-10

Ve výstupu lze identifikovat následující důležité informace :

  • KEYNAME - v příkladu Ales Padrta <apadrta@civ.zcu.cz>
  • KEY-ID - v příkladu BCB88B92
  • FINGERPRINT - v příkladu 6328 6BF1 6835 AC7F BF8B F756 D8DB 958F BCB8 8B92

V následujícím kroku je potřeba vytvořit revokační certifikát pro případ zapomenutí klíčové fráze nebo kompromitace privátního klíče. Toto se provádí příkazem

gpg --output revoke.asc --gen-revoke apadrta@civ.zcu.cz

Vzniklý soubor musí být bezpečně uschován, protože jeho zveřejněním bude veřejný klíč zneplatněn.

Pokud jste se dostali až sem, měli byste mít následující soubory (v adresáři c:\gnupg nebo ~/.gnupg:

  • secring.gpg - zde jsou uloženy všechny privátní klíče (vytvořené příkazem gpg --gen-key)
  • pubring.gpg - zde jsou uloženy všechny veřejné klíče (vytvořené příkazem gpg --gen-key nebo stažené)
  • revoke.asc - revokační certifikát (každý vytvořený pár klíčů má vlastní soubor)
  • trustdb.gpg - zde jou uloženy informace o pavučině důvěry

V souboru secring.gpg jsou uloženy privátní klíče, takže je nutné jej chránit jako oko v hlavě.

Výměna veřejných klíčů

Pro ověření podpisu je potřeba znát veřejný klíč odesílatele a pro zašifrování veřejný klíč adresáta. Nyní mám přeci pouze svůj veřejný klíč, jak se dostat k ostatním veřejným klíčům? V podstatě to jde dvěma způsoby, buď přímým zasláním nebo pomocí serveru spravujícího veřejné klíče PGP. Prakticky je používána spíše druhá varianta.

Přímá výměna vyžaduje exportování veřejných klíčů do souboru, který je pak poslán adresátovi. Export je realizován příkazem

pgp --output pubkeys.pgp --export 

Chcete-li zaslat pouze omezenou množinu klíčů, zadejte část nebo celé KEYNAME, např.

pgp --output pubkeys_pavels.pgp --export Pavel

Případně můžete klíč specifikovat jeho KEY-ID, např.

pgp --output pubkeys_pavels.pgp --export BCB88B92

Příjemce si pak následně importuje všechny veřejné klíče ze zaslaného souboru příkazem

pgp --import pubkeys.pgp

Tím jsou veřejné klíče přidány do souboru pubring.gpg, případně jsou aktualizovány informace o podpisech klíčů.

Pro zjednodušení existuje pro správu podpisů veřejných klíčů řada serverů, které výměny veřejných klíčů zajišťují. Informace zaslané na jeden server se automaticky vypropagují na ostatní. Mezi takovéto podpisové servery patří např. wwwkeys.cz.pgp.net.

Poslání veřejného klíče specifikovaného svým KEY-ID na server wwwkeys.cz.pgp.net je prováděno příkazem

gpg --send-keys --keyserver wwwkeys.cz.pgp.net <KEY-ID>

Některé (!) verze GnuPG umožňují také hromadné poslání všech veřejných klíčů a jejich podpisů ze souboru pubring.gpg na specifikovaný server příkazem

gpg --send-keys --keyserver wwwkeys.cz.pgp.net 

Hromadné zasílání je potřeba potvrdit

Do you really want to send all your public keys to the keyserver? (y/N)

Také lze (opět pouze u některých verzí) omezit množinu veřejných klíčů zadáním celého či části KEYNAME, např.

gpg --send-keys --keyserver wwwkeys.cz.pgp.net Pavel

Stažení konkrétního veřejného klíče s KEY-ID 1BEDF25D ze serveru wwwkeys.cz.pgp.net je prováděno příkazem

gpg --recv-key --keyserver wwwkeys.cz.pgp.net 1BEDF25D

Není možné stahovat více veřejných klíčů najednou. Veřejný klíč je opět přidán do souboru pubring.gpg s aktuálními informacemi o jeho podpisech.

Protože jsou veřejné klíče v průbehu času porůznu podepisovány, je vhodné si občas aktualizovat informace. Místo postupného stahování jednotlivých klíčů je používán příkaz

gpg --refresh-keys --keyserver wwwkeys.cz.pgp.net

Jsou aktualizovány informace o všech klíčích v souboru pubring.gpg.

Výpis informací o stažených veřejných klíčích

Seznam všech dostupných veřejných klíčů lze vypsat příkazem

gpg --list-keys

Opět je možné výpis omezit zadáním části KEYNAME nebo KEY-ID

gpg --list-keys Pavel
gpg --list-keys BCB88B92

Výpis FINGERPRINTU všech dostupných veřejných klíčů je prováděn příkazem

gpg --fingerprint

S omezením pro KEYNAME nebo KEY-ID pak příkazy

gpg --fingerprint Pavel
gpg --list-keys BCB88B92

Podepisování veřejných klíčů

Nejprve je potřeba získat KEYNAME, KEY-ID a FINGERPRINT klíče, který má být podepsán. Také je nutné se přesvědčit, kdo vlastní příslušný privární klíč. Postup těchto úkonů je popsán v kapitole o PGP party.

  • Stažení klíče, který má být podepsán
gpg --keyserver wwwkeys.cz.pgp.net --recv-key <Key_ID>
  • Ověření fingerprintu klíče (vypsaný fingerprint musí souhlasit s tím z PGP party)
gpg --fingerprint <Key_ID>
  • Podepsání klíče (je-li vše v pořádku)
gpg --sign-key <Key_ID>
  • Také se lze podívat, kdo všechno klíč podepsal
gpg --edit-key <Key_ID>
check
  • Odeslání podepsaného klíče na server
gpg --keyserver wwwkeys.cz.pgp.net --send-key <Key_ID>

Práce s pavučinou důvěry

Nastavení míry důvěry pro jednotlivé klíče je prováděno příkazy

gpg --edit-key <KEY-ID>
trust

Poté je potřeba vybrat míru důvěry

  • Nevím nebo neřeknu - neúčastní se výpočtů důvěry
  • Nedůvěřuji - při výpočtu důvěry je ignorován
  • Důvěřuji částečně - částečná důvěra
  • Důvěřuji úplně - plná důvěra
  • Důvěřuji absolutně - pouze pro vlastníky příslušného tajného klíče

Veřejný klíč je považován za důvěryhodný pokud je podepsán x klíči s úplnou důvěrou nebo y klíči s částečnou důvěrou. Hodnoty x a y jsou věcí každého uživatele, obvykle je x = 2 a y = 4.

Vytvoření pavučiny důvery je provedeno spuštěním příkazu

gpg --update-trustdb

Postupně jsou procházeny všechny klíče a uživatel je dotazován jak moc danému člověku věří. V podstatě dávkové spuštění výše uvedeného. Na základě uvedených informací je vypočítána pavučina důvěry

Občas je potřeba pavučinu důvěry přepočítat kvůli revokacím, novým podpisům apod. To by mělo být prováděno automaticky, nicméně tuto aktivitu lze vyvolat také příkazem

gpg --check-trustdb

Oproti příkazu gpg --update-trustdb se liší tím, že zde není žádná interakce s uživatelem. Jsou použity pouye klíče s již zadanou důvěryhodností.

Podpis souboru a jeho ověření

Podpis souboru zprava.txt, výstup je uložen do souboru zprava.sig:

gpg –-output zprava_ascii.sig –-clearsign --sign zprava.txt

Díky přítomnosti parametru --clearsign je výstup v ASCII formátu místo nativního binárního.

Ověření správnosti podpisu:

gpg --verify zprava_ascii.sig

O výsledku (podpis souhlasí/nesouhlasí) je uživatel informován výpisem.

Zašifrování a dešifrování souboru

Zašifrování souboru zprava.txt pro adresáta civenka s uložením výstupu do souboru zprava.gpg:

gpg --output zprava.gpg --encrypt --armor --recipient civenka zprava.txt

Díky přítomnosti parametru --armor je výstup v ASCII formátu místo nativního binárního.

Dešifrování zašifrovaného souboru:

gpg --output zprava.txt --decrypt zprava.gpg

Podpis odesílatele a zašifrování současně

Zašifrování a podpis kombinuje příslušné přepínače:

gpg --output encrypted-signed.gpg --armor --recipient civenka --encrypt --sign topsecret.txt

Dešifrování a současně ověření podpisu odesílatele (parametr --decrypt v tomto případě zajistí i ověření podpisu):

gpg --output desifrovano.txt –-decrypt encrypted-signed.gpg

Používání PGP na více počítačích

Pokud je potřeba používat PGP na více počítačích současně, např. pracovní stanice a notebook, je nepraktické uchovávat veřejné i privátní klíče na několika místech současně. Nehledě na nutnost zabezpečit citlivé údaje na všech počítačích.

Proto je vhodným řešením uchovávat všechny klíče na jednom místě (např. flashdisku) a přimět GnuPG, aby klíče vždy hledalo v tomto umístění místo standardního c:\gnupg nebo ~/.gnupg. Následující příklady předpokládají, že obsah zmíňených adresářů byl přesunut na flashdisk do adresáře gnupg.

MS Windows (GnuPG)

  • Vytvořit v registrech klíč
HKEY_CURRENT_USER\Software\GNU\GnuPG
  • Do vytvořeného klíče zadat položku HomeDir, která specifikuje adresář obsahující informace o klíčích (zde např. f:/gnupg). Mlčky předpokládejme, že MS Windows flashdisku přiřadí vždy stejné písmeno (obvykle tomu tak je).

MS Windows (gpg4win)

  • Nastavit systémovou proměnnou GNUPG
GNUPGHOME=f:\gnupg
  • Správnou funkčnost lze ověřit příkazem
gpg --version

...
Home: f:/gnupg
...

Linux

  • Vytvořit symbolický link (pro systém, který připojí flashdisk jako /media/usb0).
ln -s /media/usb0/gnupg ~/.gnupg

Po provední těchto kroků už stačí pouze přijít ke správně nakonfigurovanému počítači, připojit flashdisk a používat PGP. Pokud není připojen, PGP nebude schopno pracovat.