YubiKey NEO a OpenPGP Card

V předchozím blogu o klíči YubiKey NEO bylo nastíněno, že může fungovat i jako OpenPGP Card. Tedy stát se pro PGP (resp. budeme zkoumat GnuPG) tím, co jsou hardwarové PKI tokeny pro X.509 certifikáty. Výhodou tedy je, že privátní klíč je uložen přímo v klíči a nelze jej softwarově nijak vyexportovat ven. Operace, při kterých je privátní klíč potřeba (podepisování, dešifrování) se pak provádí tak, že data se předají klíči a ten vrátí zpracovaná data zpátky. Narozdíl od situace, kdy privátní klíč je uložen na disku počítače, tady prakticky nelze privátní klíč zkopírovat bez vědomí jeho vlastníka. Lze ukrást celý token, ale toho si vlastník patrně již všimne.

Pro funkci OpenPGP karty je potřeba mít na YubiKey nainstalovaný applet. Applet prakticky na všech NEO tokenech je již předinstalován, nicméně je potřeba jej aktivovat - respektive konkrétně přepnout mód, pod kterým se YubiKey počítači hlásí. Z výroby se totiž YubiKey tváří jako USB klávesnice a nic víc. Zatímco GPG očekává čipovou kartu. Použijeme tedy nástroj ykpersonalize a zapneme na YubiKey CCID interface. YubiKey se dá přepnout do několika módů. Ve výchozím stavu má zapnutý pouze HID interface. My ho přepneme na kompozitní zařízení, kdy bude nabízet jak HID rozhraní, tak CCID. Nicméně výše zmíněným nástrojem se dá přepnout i do stavu, kdy nabízí jen CCID rozhraní. Pikantní na tom je to, že ykpersonalize komunikuje pouze přes HID - pokud tedy přepnete YubiKey do CCID only režimu, nelze ykpersonalize znovu použít. Nicméně existuje nástroj, který jej dokáže přepnout zpět i v CCID only režimu. Pokud tedy máme utilitu, přepneme YubiKey pomocí příkazu ykpersonalize -m82. Pro změnu je potřeba YubiKey restartovat, tedy vyjmout z USB portu a vložit zpět. Nyní by již náš počítač měl vidět dvě zařízení a ne jen jedno. Pro funkčnost na Linuxu je potřeba mít nainstalován akorát pcsc-lite (na Windows by dokonce nemělo být potřeba vůbec nic; sic budou řvát, že nenašly ovladač, na funkčnost to nemá vliv a ta otravná hláška jde snad také vypnout). Dále bude potřebovat mít nainstalované GnuPG (na Windows lze úspěšně použít Gpg4win).

Pokud se vše zadařilo, měl by nám (samozřejmě při zapojeném YubiKey) příkaz gpg --card-status vypsat nějaké informace o naší kartě. K používání nám brání to, že na ní nemáme žádný klíč. Pokračujeme tedy gpg --card-edit následované příkazem admin. Nyní můžeme provádět změny na naší OpenPGP kartě. Pro vygenerování klíče použijeme příkaz generate. Následně budeme dotázáni na PIN a Admin PIN (ty jsou podstatné, klíč v YubiKey není šifrovaný heslem, jako ty nacházející se na disku. Ale naopak celý YubiKey je právě chráněn PINem a bez jeho zadání jej nelze použít. Použití PINu je limitováno na několik špatných pokusů, potom je PIN zablokován a odblokovat jej lze při znalosti Admin PINu) a další detaily ohledně našeho klíče. Po jejich zadání bude YubiKey chvíli chroustat a výsledkem by mělo být vygenerování páru klíčů. Za zmínku v tuhle chvíli stojí určitě to, že narozdíl od PKI tokenu v YubiKey se nachází pouze privátní klíč. Ten veřejný byl přidán do klíčenky na disku. Je tedy nanejvýš vhodné jej hned vyexportovat a zazálohovat, eventuelně zveřejnit na keyserverech. Pokud budeme zkoumat možnosti, co máme v gpg --card-edit, najedeme zde volbu URL a fetch. U URL můžeme připsat URL adresu, kde lze stáhnout náš veřejný klíč. Fetch naopak zase se pokusí veřejný klíč stáhnout a naimportovat (ať už ze zadané URL nebo z keyserveru) - to je následně vhodné, až budeme náš YubiKey používat na dalších počítačích. A v neposlední řade za zmínku stojí také to, že privátní klíč existuje pouze v YubiKey a z principu věci jej nelze zazálohovat. Tedy pokud YubiKey ztratíte, zničíte atd, přijdete i o privátní klíč (a nebudete eventuelně schopni dešifrovat data zašifrovaná odpovídajícím veřejným klíčem).

Krátce tedy ještě k používání YubiKey na dalších počítačích. Po nainstalování GnuPG a zapojení klíče do USB jej GPG sice uvidí, bude mu chybět ale veřejný klíč. Použijeme tedy opět gpg --card-edit a následně fetch - tím by mělo dojít k naimportování veřejného klíče. Následně doporučuji ještě verify (někde mi to bez něj nechtělo fungovat), který se zeptá na PIN a následně ověří kartu. Po tomto kroku by již GPG mělo fungovat stejně jako na původním počítači.

Práce s GPG a YubiKey je úplně transparentní. YubiKey se tváří jako další klíčenka se soukromými klíči (pokud je vložen v USB portu). Můžeme tedy vesele používat GPG jak jsme zvyklí. Při podepisování nebo dešifrování souborů se akorát zobrazí dialog pro vložení PINu k YubiKey a následně operace proběhne. Ve výchozím nastavení se GPG na PIN ptá při každé operaci. Změnit se to dá volbou forcesig v gpg --card-edit - tím dojde k tomu, že GPG se zeptá na PIN pouze jednou do doby, než je YubiKey vyjmut z USB portu.

Podepisování a dešifrování by mělo fungovat i v e-mailových klientech, kteří GnuPG používají. Díky tomu, že GPG funguje standardně, neměl by s tím být problém. Nicméně na jednu odlišnost jsem narazil. Odlišností je to, že privátní klíč v YubiKey není chráněn heslem a nelze tedy heslo do GPG předat, jako to jde v případě normálních klíčů. Někteří e-mailový klienti ale mají vlastní dialog pro zadání hesla a stejně to zkouší. Do GPG se heslo předává argumentem --passphrase-fd a následně číslem file descriptoru, na kterém se heslo nachází. To obvykle bývá STDIN, stejně jako se následně na STDIN nasype zpráva k podepsání. GPG si vezme první řádek ze STDIN, myslí si o něm, že je to heslo ke klíči a zahodí ho, protože jej nepotřebuje (ne, nepoužije ho jako PIN ke kartě). No a hádejte, co se stane, když ten dialog na zadání hesla v e-mailovým klientu pouze odbouchnete, protože je k ničemu a cokoliv tam zadáte, nemá žádný vliv. E-mailový klient stejně spustí GPG s argumentem --passphrase-fd, ale heslo tam nepošle, protože jste ho nezadali. A GPG následně sežere první řádek z předané e-mailové zprávy. Pokud navíc používáte PGP-MIME, tak se to zjišťuje ještě daleko hůř - součástí PGP-MIME zprávy jsou obvykle i hlavičky k dané části zprávy. Výsledkem tedy je, že nezmizí přímo kus zprávy, ale zmizí hlavičky, takže se tu a tam rozbije diakritika, příloha je nečitelná, a tak podobně... Bezproblémově YubiKey s GPG fungoval u muttu a Thunderbirdu. Naopak problém s mizejícím řádkem zprávy jsem viděl u The Bat! Ale popravdě se může stejně vyskytnout i u jiných klientů, kteří GPG podporují.