3.2. Vytvoření a úpravy klíčů, výměna veřejných klíčů

Asymetrická kryptografie s veřejnými klíči je základem používání OpenPGP. Před podepsáním dokumentu/dopisu si musíte vytvořit svoji dvojici privátního a veřejného klíče. Před zašifrováním souboru pro někoho musíte získat nejdříve veřejný klíč příjemce. Obdobně před odesláním zašifrovaného dopisu pro Vás musí odesílatel získat Váš veřejný klíč.

3.2.1. Vygenerování privátních a veřejných klíčů

Své klíče vygenerujete v terminálovém okně po zadání příkazu:

gpg --gen-key

Ve verzi 2.1 se Vás aplikace nejdříve zeptá na Vaše skutečné jméno (Real name) a e-mailovou adresu (Email address). Pro účely cvičení prosím zadejte e-mailovou adresu username@bis.vse.cz. Následně potvrdíte, že jste zadali správné údaje, a poté se objeví dotaz na heslovou frázi (Passphrase). Po získání dostatečného množství entropie pro kryptografický generátor náhodných čísel se vygenerují klíče a současně se vytvoří revokační certifikát pro revokování klíče v případě ztráty či zcizení privátních klíčů.

Vygenerují se RSA klíče s délkou 2048 bitů.

Výpis 3.1 Vygenerování RSA klíčů pomocí gpg --gen-key ve verzi 2.1x GnuPG.
gpg --gen-key
gpg (GnuPG) 2.1.17; Copyright (C) 2016 Free Software Foundation, Inc.

Note: Use "gpg --full-gen-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: Luboš Pavlíček
Email address: pavlicek@bis.vse.cz
You are using the 'utf-8' character set.
You selected this USER-ID: "Luboš Pavlíček <pavlicek@bis.vse.cz>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O

… dotaz na heslovou frázi …

gpg: key 531F3C9784EDED03 marked as ultimately trusted
gpg: revocation certificate stored as '/home/pavlicek/.gnupg/openpgp-revocs.d/5F6531D215510ED6C980D072D8B962F5C16C4D45.rev'
public and secret key created and signed.

pub   rsa2048 2016-12-03 [SC] [expires: 2018-12-03]
      A169316E65B5F8F393AC9886531F3C9784EDED03
uid                      Luboš Pavlíček <pavlicek@bis.vse.cz>
sub   rsa2048 2016-12-03 [E] [expires: 2018-12-03]

Vygenerovaný klíč identifikuje buď otisk (fingerprint) nebo dlouhé či krátké keyid. Pro výše vygenerovaný klíč mají následující hodnoty:

fingerprint (otisk): A169316E65B5F8F393AC9886531F3C9784EDED03
long keyid (dlouhé keyid): 531F3C9784EDED03
short keyid (krátké keyid): 84EDED03

Otisk se počítá z klíče obvykle jako SHA-1 haš o délce 160 bitů (40 hexadecimálních číslic), dlouhé keyid je posledních 16 hex znaků z otisku, krátké keyid je posledních 8 hex znaků z otisku. Nedoporučuje se používat krátké keyid, neboť existuje poměrně velká pravděpodobnost kolize již v případě několika tisíc uživatelů. Verze 2.1 preferuje používání otisků.

Je vhodné nastavit vygenerovaný klíč jako preferovaný – v souboru ~/.bashrc či v souboru ~/.profile nastavíte proměnnou GPGKEY, tj. doplníte následující řádek s otiskem či dlouhým keyid Vašeho klíče:

export GPGKEY=A169316E65B5F8F393AC9886531F3C9784EDED03

Nastavení se uplatní při příštích přihlášení. Váš klíč můžete též doplnit do konfiguračního souboru ~/.gnupg/gpg.conf.

V mnoha případech se lze na klíč odkazovat i pomocí e-mailové adresy. Vygenerovaný klíč expiruje za 2 roky, v průběhu doby uživatel může platnost prodloužit.

3.2.2. Pokročilejší generování klíče, generování ve starších verzích

Pokud byste chtěli klíče dle algoritmu DSA, delší klíč RSA či zadat dobu platnosti klíčů, tak pro generování použijte přepínač --full-gen-key:

gpg --full-gen-key # verze 2.1

Tento přepínač odpovídá přepínači --gen-key ve verzích 1.4 a 2.0 programu gpg.

gpg --gen-key # verze 2.0 či 1.4

Nejdříve se vybírá algoritmus generovaného klíče:

Výpis 3.2 Volba druhu generovaných klíčů. Obvykle se vybírá volba 1.
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1

V první volbě se vygenerují RSA klíče pro podepisování a šifrování. Druhá volba umožňuje vygenerovat klíče pomocí algoritmů založených na algoritmu Diffie-Hellman pro výměnu klíčů. DSA (Digital Signature Algorithm) se používá pro podepisování, Elgamal pro šifrování. Ve třetí a čtvrté volbě se vygenerují pouze klíče pro podepisování. Klíče pro šifrování lze vygenerovat dodatečně.

Následně volíte délku klíče. U RSA je přípustná délka od 1024 do 4096, nedoporučuje se používat klíče kratší než 2048 bitů (v některých aplikacích jsou kratší klíče odmítány).

Výpis 3.3 Zadání délky generovaného RSA klíče. Zde uživatel volí délku 4096 bitů.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096

Následně můžete určit dobu platnosti vygenerovaných klíčů. Tuto dobu si můžete sami kdykoliv prodloužit a proto se doporučuje nastavit platnost na jeden rok. Pokud byste klíče ztratili či přestali používat, tak uplynutím času se zneplatní.

Výpis 3.4 Nastavení doby platnosti vygenerovaného klíče. Doporučená hodnota je 1y - jeden rok.
Please specify how long the key should be valid.
       0 = key does not expire
    <n>  = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
Key is valid for? (0) 1y

Další průběh generování klíče je stejný, jako ve zjednodušené variantě.

Existuje ještě expertní úroveň generování klíčů:

gpg --full-gen-key --expert # verze 2.1
gpg --gen-key --expert # verze 2.0 či 1.4

Ve verzi 2.1 lze poté zvolit i klíče založené na eliptických křivkách. Uživatele starších verzí s nimi ale nebudou schopni pracovat, takže nyní se doporučuje je jako hlavní klíč nepoužívat.

Výpis 3.5 Typy generovaných klíčů vytvářených na expertní úrovni ve verzi 2.1.
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
   (9) ECC and ECC
   (10) ECC (sign only)
   (11) ECC (set your own capabilities)
Your selection?

3.2.3. Klíčenka – úložiště klíčů

Při vygenerování klíčů se vytvoří v domovském adresáři podadresář .gnupg, a v něm klíčenka (keyring 6) – soukromé úložiště pro vlastní klíče i pro veřejné klíče ostatních. Pokud klíč není ve Vaší klíčence, tak ho nemůžete použít pro šifrování či ověřování podpisů. Ve verzi 2.1 je klíčenka v souboru pubring.kbx, ve verzích 1.4 a 2.0 se klíče ukládají do dvou souborů – soukromé do secring.gpg a veřejné do souboru pubring.gpg.

3.2.4. Výpis informací o klíči, užití klíčů

V GnuPG se rozlišují čtyři různá užití klíčů (anglicky capabilities):

S (sign)

podepisování dopisů a souborů,

C (certify)

podepisování vlastních podklíčů a cizích veřejných klíčů,

E (encrypt)

šifrování dopisů/souborů,

A (authenticate)

autentizace uživatel, GnuPG může obsahovat klíče pro přihlašování pomocí SSH či TLS.

_images/pgp_image1.png

Hlavní klíč musí mít vždy užití C pro podepisování jiných klíčů. Pro ostatní užití mohou být vygenerovány podklíče (subkey) – samostatné dvojice privátní a veřejný klíč. Toto rozdělení umožňuje nastavovat různou dobu platnosti jednotlivých podklíčů, různé algoritmy a délky klíčů 7. Hlavní klíč má obvykle nastaveno užití Certify a Sign. Pro šifrování (Encryption) se vygeneruje podklíč.

Uživatel obvykle nemusí nad existencí podklíčů přemýšlet – program vybírá správné klíče dle požadované operace.

Seznam známých klíčů (vygenerovaných nebo importovaných) lze vypsat příkazy:

gpg --list-keys # seznam veřejných klíčů
gpg --list-secret-keys # seznam soukromých klíčů

Ve výpisech (viz obrázek 1‑8) jsou u klíčů následující údaje:

  • typ klíče – používají se akronymy pub (veřejný klíč), sec (privátní klíč), sub (veřejná část podklíče), ssb (privátní část podklíče),

  • algoritmus a velikost klíče – rsa2048 (někdy 2048R) označuje RSA klíče o délce 2048 bitů,

  • datum vytvoření klíče a případně i datum expirace klíče,

  • užití klíče,

  • datum expirace, pokud je nastaveno.

Výpis 3.6 Výpis veřejných klíčů pomocí gpg --list-keys a privátních klíčů pomocí gpg --list-secret-keys.
gpg --list-keys
pub   rsa2048 2016-12-03 [SC] [expires: 2018-12-03]
      A169316E65B5F8F393AC9886531F3C9784EDED03
uid           [ultimate] Luboš Pavlíček <pavlicek@bis.vse.cz>
sub   rsa2048 2016-12-03 [E] [expires: 2018-12-03]

gpg --list-secret-keys
sec   rsa2048 2016-12-03 [SC] [expires: 2018-12-03]
      A169316E65B5F8F393AC9886531F3C9784EDED03
uid           [ultimate] Luboš Pavlíček <pavlicek@bis.vse.cz>
ssb   rsa2048 2016-12-03 [E] [expires: 2018-12-03]

Druhý řádek každého výpisu obsahuje otisk klíče. Ve starších verzích se obvykle nevypisuje otisk klíče, ale jenom keyid umístěné vedle typu klíče.

Řádek uvozený uid obsahuje identifikace vlastníka klíče (jméno, příjmení a e-mailová adresa). Před jménem je v hranatých závorkách platnost (validity). Pokud znáte privátní klíč, tak platnost je vždy ultimate (nejvyšší). Problematiku platnosti klíčů probereme v kapitole TODO.

3.2.5. Editace klíčů

Údaje u svých i cizích veřejných klíčů můžete měnit pomocí:

gpg --edit-key ID_klíče

Této příkaz uživatele přesune do interaktivního režimu, ve kterém můžete pomocí povelů modifikovat vybraný klíč. Mezi základními povely zmiňme:

  • help – vypsání dostupných povelů,

  • quit – ukončení editace, zeptá se, zda uložit změny,

  • save – uloží provedené úpravy a ukončí program,

  • adduid – přidání další identifikace uživatele (uid), obvykle přidání další e-mailové adresy,

  • deluid – mazání některé identifikace uživatele,

  • addkey – přidání podklíče,

  • delkey – mazání podklíče,

  • revkey – zneplatnění (revokování) klíče,

  • passwd – změna heslové fráze k privátnímu klíči,

  • expire – úprava doby vypršení platnosti klíče či podklíče,

  • trust – nastavení důvěry pro cizí veřejný klíč,

  • sign – podepsání cizího veřejného klíče,

  • revsig – zneplatnění (revokování) podpisu cizího veřejného klíče,

Při editaci klíče se nejdříve zobrazí informace o klíči včetně neplatných podklíčů. Vedle platnosti (validity) se zobrazuje důvěryhodnost (trust). Obojí si podrobnější popíšeme v kapitole TODO.

Výpis 3.7 Editace klíče – přidání druhé e-mailové adresy.
gpg --edit-key A169316E65B5F8F393AC9886531F3C9784EDED03
Secret key is available.

sec  rsa2048/531F3C9784EDED03
     created: 2016-12-03  expires: 2018-12-03  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/EE058757E90BF9F5
     created: 2016-12-03  expires: 2018-12-03  usage: E
     [ultimate] (1). Luboš Pavlíček <pavlicek@bis.vse.cz>

gpg> adduid
Real name: Luboš Pavlíček
Email address: lubos.pavlicek@bis.vse.cz
Comment:
You are using the 'utf-8' character set.
You selected this USER-ID: "Luboš Pavlíček <lubos.pavlicek@bis.vse.cz>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

sec  rsa2048/531F3C9784EDED03
     created: 2016-12-03  expires: 2018-12-03  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/EE058757E90BF9F5
     created: 2016-12-03  expires: 2018-12-03  usage: E
     [ultimate] (1)  Luboš Pavlíček <pavlicek@bis.vse.cz>
     [ unknown] (2). Luboš Pavlíček <lubos.pavlicek@bis.vse.cz>

gpg> save

U všech klíčů se zobrazuje dlouhé keyid (ve starších verzích se zobrazuje krátké keyid). Podklíč má vlastní odlišné keyid. Vždy zadávejte identifikaci hlavního klíče – výjimkou je prodlužování platnosti či revokování jednoho konkrétního podklíče.

3.2.6. Exportování a importování veřejných klíčů

Aby bylo možné někomu poslat zašifrovaný soubor nebo zprávu, je nutné získat jeho veřejný klíč. Existuje několik možností, jak si klíče vyměnit, každá má své výhody a nevýhody. Zde popíšeme exportování do souboru a importování ze souboru. Bezpečný přenos zajistíte sami.

Exportování veřejných klíčů zajistí přepínač --export.

gpg --export [--output jméno_souboru] [--armor] [id_klíče]

Lze zadat jméno výstupního souboru, jinak se vypisuje na standardní výstupní zařízení. Běžně se vytváří binární výstup, přepínač armor zajistí konverzi do ASCII formátu. Jako parametr zadejte identifikaci jednoho či více klíčů. Pokud klíče nezadáte, vyexportují se všechny klíče.

Výpis 3.8 Příklady exportování klíčů z klíčenky.
gpg --export pavlicek@bis.vse.cz > pavlicek.gpg
gpg --export --output pavlicek.txt --armor 531F3C9784EDED03
gpg --export --output all_public_keys.gpg

Na prvním řádku se binárně vyexportuje veřejný klíč uživatele pavlicek@bis.vse.cz a pomocí přesměrování STDOUT se uloží do souboru. Na druhém řádku se vyexportuje klíč s keyid 531F3C9784EDED03 do textového souboru. Ve třetím příkladu se vyexportují všechny veřejné klíče.

Exportuje se vždy veřejná část hlavního klíče a veřejné části všech podklíčů. Součástí výstupu jsou i mnohé atributy spojené s klíčem – identifikace uživatele, platnost, podpisy klíčů či preferované kryptografické algoritmy uživatele.

Klíče v souboru se do klíčenky nahrají pomocí přepínače --import

gpg --import jméno_souboru

Import je inteligentní – pokud již klíč ve Vaší klíčence existuje, tak pouze zaktualizuje jeho atributy.

Výpis 3.9 Výpis veřejných klíčů pomocí gpg --list-keys. Druhý klíč je importovaný od uživatele robot@bis.vse.cz.
gpg --list-keys
pub   rsa2048 2016-12-03 [SC] [expires: 2018-12-03]
      A169316E65B5F8F393AC9886531F3C9784EDED03
uid           [ultimate] Luboš Pavlíček <pavlicek@bis.vse.cz>
sub   rsa2048 2016-12-03 [E] [expires: 2018-12-03]

pub   rsa2048 2014-03-20 [SC] [expires: 2017-03-08]
      5A4CEE4D6FEABAD3916B73EC5082CC38651A108C
uid           [ unknown] Robot <robot@bis.vse.cz>
sub   rsa2048 2016-03-08 [E] [expires: 2017-03-08]

Přepínač --export-secret-keys exportuje privátní klíče. To použijete v případě, že chcete přenášet své klíče na další počítač. I soukromé klíče se importují pomocí přepínače --import.

3.2.7. Výměna veřejných klíčů přes klíčový server (keyserver)

Exportovaný klíč si mohou účastníci vyměňovat jako přílohu e-mailu, přes přenosný USB disk apod. Pokud je větší počet účastníků (více než 10), tak je tento způsob výměny klíčů problematický – někdo pošle změnu klíče jen některým účastníkům, někdo si zapomene naimportovat některý klíč apod.

Řešením je použit klíčový server (keyserver) – když někdo změní nějaký klíč, tak změnu nahraje na klíčový server. Všichni si pravidelně aktualizují své klíčenky dle údajů na klíčovém serveru.

Klíčové servery jsou veřejné a soukromé, mohou používat protokoly HKP (OpenPGP HTTP Keyserver Protocol) či LDAP. Z veřejných serverů jsou nejznámější keys.gnupg.net či pgp.mit.edu.

Na cvičeních budeme používat soukromý klíčový server na bis.vse.cz, který je dostupný pouze ze školní sítě. Server má též jednoduché webové rozhraní na https://bis.vse.cz/sks/.

Pro výměnu klíčů s klíčovým serverem se používají následující příkazy:

gpg --keyserver klíčový_server --send-keys ID_klíče […]
gpg --keyserver klíčový_server --search-keys parametr_hledání
gpg --keyserver klíčový_server --recv-keys ID_klíče […]
gpg --keyserver klíčový_server --refresh-keys

Přepínač --search-keys se používá pro vyhledání či aktualizaci klíče, stačí zadat část jména či část e-mailové adresy a vyhledají se všechny klíče, které zadanému řetězci přibližně odpovídají. Uživatel si poté vybere klíče, které si chce nahrát do své klíčenky.

Výpis 3.10 Stažení konkrétního veřejného klíče z klíčového serveru, nahrání veřejného klíče na server.
gpg --keyserver bis.vse.cz --search-keys robot@bis.vse.cz
gpg: data source: http://bis.vse.cz:11371
(1) Robot Primus (R.U.R.) <primus@bis.vse.cz>
    4096 bit RSA key 4CEB66E448C0187B, created: 2015-10-23, expires: 2018-04-01
(2) Robot <robot@bis.vse.cz>
    2048 bit RSA key 5082CC38651A108C, created: 2014-03-20, expires: 2017-03-08
Keys 1-2 of 2 for "robot@bis.vse.cz".  Enter number(s), N)ext, or Q)uit > 2
gpg: key 5082CC38651A108C: public key "Robot <robot@bis.vse.cz>" imported

U přepínačů --send-keys a --recv-keys je potřeba zadat identifikaci klíče, viz následující ukázka.

Výpis 3.11 Stažení konkrétního veřejného klíče z klíčového serveru, nahrání veřejného klíče na server.
gpg --keyserver bis.vse.cz --recv-keys 92001940314FDED5
gpg: key 92001940314FDED5: public key "Dr. Gall (R.U.R.) <gall@bis.vse.cz>" imported
gpg --keyserver bis.vse.cz --send-keys 5082CC38651A108C
gpg: sending key 5082CC38651A108C to hkp://bis.vse.cz

Poslední přepínač --refresh-keys zaktualizuje všechny veřejné klíče, které máte ve své klíčence.

Údaje na klíčovém serveru jsou dostupné komukoliv, kdo se na server připojí. To zjednodušuje výměnu veřejných klíčů, ale současně omezuje soukromí, neboť kdokoliv se může dozvědět e-mailové adresy a případně i vazby mezi uživateli. Veřejné klíčové servery usnadňují MitM útoky, neboť kdokoliv může vytvořit klíč s cizím jménem a s cizí e-mailovou adresou a tento klíč publikovat – blíže v kapitole TODO.

6

Česky doslova „kroužek na klíče“.

7

Oddělení klíče pro šifrování vychází též z vlastností algoritmů nad Diffie-Hellman, kde dvojici klíčů pro digitální podepisování (DSA) nelze použít pro šifrování pomocí Elgamal. Stejné omezení je i u algoritmů nad eliptickými křivkami.