Portál AbcLinuxu, 26. dubna 2024 11:09

GPG a Yubikey

13.6.2020 23:10 | Přečteno: 2384× | Linux | Výběrový blog

Jak jsem slíbil, podíváme se na spolupráci GPG a Yubico, konkrétně s Yubikey 5. Než začnu, chci všem poděkovat za diskusi k minulému dílu (https://www.abclinuxu.cz/blog/Tomik/2020/5/uvod-do-gpg). Je to opravdu studnice vědomostí.

První oťukání

Yubikey je věcička, která umí vícero protokolů, jedním z nich je i Smart Card, o které dneska bude řeč. Dostáváme se tak do schizofrenní situace, jak mu říkat. Pokud bude řeč o vlastnostech, které mají spojitost s protkolem Smart Card, budu psát karta, pokud budu psát o fyzickém zařízení, budu psát token.

Yubikey 5 umí jenom RSA klíče, dobrá zpráva je, že už umí klíče délky až 4096. Potřebujete k tomu GnuPG verze 2 a výše (https://support.yubico.com/support/solutions/articles/15000014219-yubikey-5-series-technical-manual#OpenPGPattgv)

Abychom mohli pracovat skrze GPG s kartou (Smart Card), potřebujeme nainstalovat scdaemon
tom@mike:~$ sudo apt-get install scdaemon
Nejdřív zkusíme zobrazit informace o kartě. Ve slotu mám Yubikey 5 (černý, s NFC)
tom@mike:~$ gpg --card-status
Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006120368550000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 12036855
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
Všimneme si, že na kartě můžou být informace o držiteli (pokud si je tam dá), pak si všimneme, že můžeme uložit Signature key, Encryption key a Authentication key. Po jednom od každého kousku. Kartě je vcelku jedno, jaké klíče tam uložíme (ve smyslu identity), pokud tedy mají příslušný typ (capability). Pokud chcete mít na jedné kartě více klíčů se stejným účelem (a různou identitou), musíte asi sáhnout po nějakém HSM (hardware security module). Od Yubica stojí 650 dolarů (a to asi bez DPH), odkaz: https://www.yubico.com/store/#yubihsm. Konkurence Nitrokey má v nabídce něco, čemu taky říká HSM a stojí jenom 69 eur (https://shop.nitrokey.com/shop/product/nk-hsm-2-nitrokey-hsm-2-7). Nemám doma ani jedno, takže to víc nepopíšu.

Práce s kartou

Pokud chceme editovat informace, použijeme příkaz --edit-card. Zobrazí nám totéž, co předchozí příkaz a ještě čeká na další příkazy. Vypíšeme si nápovědu.
tom@mike:~$ gpg --edit-card

Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006120368550000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 12036855
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card> help
quit           quit this menu
admin          show admin commands
help           show this help
list           list all available data
fetch          fetch the key specified in the card URL
passwd         menu to change or unblock the PIN
verify         verify the PIN and list all data
unblock        unblock the PIN using a Reset Code

gpg/card> 
Význam zobrazených příkazů je vcelku jasný, ale nějak tam chybí něco, čím bychom mohli měnit data. Použijeme příkaz admin, abychom povolili a zobrazili všechny příkazy
gpg/card> admin
Admin commands are allowed

gpg/card> help
quit           quit this menu
admin          show admin commands
help           show this help
list           list all available data
name           change card holder's name
url            change URL to retrieve key
fetch          fetch the key specified in the card URL
login          change the login name
lang           change the language preferences
sex            change card holder's sex
cafpr          change a CA fingerprint
forcesig       toggle the signature force PIN flag
generate       generate new keys
passwd         menu to change or unblock the PIN
verify         verify the PIN and list all data
unblock        unblock the PIN using a Reset Code
factory-reset  destroy all keys and data
V tuto chvíli jenom zmíním příkaz factory-reset, který uvede kartu do stavu, jak přišla z továrny (takže se nemusíte bát nejdřív si všechno vyzkoušet). Nenašel jsem nic, jak vynulovat jenom část údajů, musíte vždy smazat celou kartu.

Zkouška informativních údajů

Zkusíme přidat informace o uživateli. Jsou to jenom informativní údaje, které GPG ignoruje. Výhoda asi je, že když vám někdo token ukradne, tak zjistí, jak se jmenujete a ke kterému pohlaví se hlásíte.
gpg/card> name
Cardholder's surname: Example
Cardholder's given name: First
Zobrazí se dialog, který chce admin PIN, ve výpisu to není vidět.

Dále nastavíme pohlaví a jazykové preference.
gpg/card> sex
Sex ((M)ale, (F)emale or space): m
Jak vidíte, zde je svět v pořádku, člověk je buď muž, nebo žena. Ostatní případy se házejí pod položku "unspecified".
gpg/card> lang
Language preferences: cz
Jazykové preference musí být 2 malá písmena, cokoliv jiného odmítne. Na druhou stranu, asi přijme libovolná 2 malá písmena.

Na závěr si znovu vypíšeme informace
gpg/card> list

Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006120368550000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 12036855
Name of cardholder: First Example
Language prefs ...: cz
Sex ..............: male
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Práce s klíči

Teď začneme přesouvat klíče. Máme je vygenerované už od minule. Předtím ještě uděláme zálohu adresáře .gnupg a nazveme ho .gnupg_orig.

Chceme přesouvat soukromé klíče, tak si je zobrazíme:
tom@mike:~$ gpg -K 
/home/tom/.gnupg/pubring.kbx
----------------------------
sec   rsa2048 2020-05-24 [SC] [expires: 2022-05-24]
      153130ED26CA404C8B29795B4703A5B671B96E4D
uid           [ultimate] Example First <example.first@example.example>
ssb   rsa2048 2020-05-24 [E] [expires: 2022-05-24]
ssb   rsa4096 2020-05-24 [S]

sec   rsa4096 2020-05-24 [SC]
      E2066568A1FB5723B550410D942AFD64430801F7
uid           [ultimate] Example Second (Second) <example.second@example.example>
ssb   rsa4096 2020-05-24 [E]

sec   rsa4096 2020-05-24 [SC]
      40DB1E1705A9B52E3EFBB29EDD41A31BA28D0199
uid           [ultimate] Example Third (Third) <example.third@example.example>
ssb   elg4096 2020-05-24 [E] [expires: 2020-06-07]

sec   rsa4096 2020-05-24 [CA]
      46C4F15BF45B274B155F9E08E815C1EA446EE732
uid           [ultimate] Example Fourth (Authenticate) <example.fourth@example.example>

Autentizační klíč

Zkusíme na kartu přesunout poslední klíč jako autentizační klíč. Podle dokumentace (https://www.gnupg.org/howtos/card-howto/en/ch03.html) ho sice GPG nepoužívá, ale přesunout si ho můžeme. Spustíme tedy GPG --edit-key a potom použijeme příkaz keytocard. Příkaz bude chtít admin PIN, který opět není vidět ve výpisu.
tom@mike:~$ gpg --edit-key 46C4F15BF45B274B155F9E08E815C1EA446EE732
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/E815C1EA446EE732
     created: 2020-05-24  expires: never       usage: CA  
     trust: ultimate      validity: ultimate
[ultimate] (1). Example Fourth (Authenticate) <example.fourth@example.example>

gpg> keytocard
Really move the primary key? (y/N) y
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 3

sec  rsa4096/E815C1EA446EE732
     created: 2020-05-24  expires: never       usage: CA  
     trust: ultimate      validity: ultimate
[ultimate] (1). Example Fourth (Authenticate) <example.fourth@example.example>
gpg> save
Teď se podíváme, co nám to udělalo.
tom@mike:~$ gpg --card-status

Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006120368550000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 12036855
Name of cardholder: First Example
Language prefs ...: cz
Sex ..............: male
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: 46C4 F15B F45B 274B 155F  9E08 E815 C1EA 446E E732
      created ....: 2020-05-24 21:10:10
General key info..: pub  rsa4096/E815C1EA446EE732 2020-05-24 Example Fourth (Authenticate) <example.fourth@example.example>
sec   rsa4096/E815C1EA446EE732  created: 2020-05-24  expires: never     


tom@mike:~$ gpg -K --with-keygrip
/home/tom/.gnupg/pubring.kbx
----------------------------
sec   rsa2048 2020-05-24 [SC] [expires: 2022-05-24]
      153130ED26CA404C8B29795B4703A5B671B96E4D
      Keygrip = 377C02935881630C7F4BA0807C8D753B6635CB90
uid           [ultimate] Example First <example.first@example.example>
ssb   rsa2048 2020-05-24 [E] [expires: 2022-05-24]
      Keygrip = 383B2ACADA9228E29820F89A1C4A4F4D18408562
ssb   rsa4096 2020-05-24 [S]
      Keygrip = E186137C42342AA7D3588183CC4B1FB6ED590E61

sec   rsa4096 2020-05-24 [SC]
      E2066568A1FB5723B550410D942AFD64430801F7
      Keygrip = 8590A9CA8F1385AD2984DD1ED501B1EDA947C90C
uid           [ultimate] Example Second (Second) <example.second@example.example>
ssb   rsa4096 2020-05-24 [E]
      Keygrip = 541540C36217BEED3F9147261B050026CB93166B

sec   rsa4096 2020-05-24 [SC]
      40DB1E1705A9B52E3EFBB29EDD41A31BA28D0199
      Keygrip = D6C7F494928F6EA71BE53DA60BDEBFA0FCBC6DB2
uid           [ultimate] Example Third (Third) <example.third@example.example>
ssb   elg4096 2020-05-24 [E] [expires: 2020-06-07]
      Keygrip = 1E810267D620D288961DEA34A08CE42932ACEE10

sec>  rsa4096 2020-05-24 [CA]
      46C4F15BF45B274B155F9E08E815C1EA446EE732
      Keygrip = C4EE06A7E2208178B43659AB57774A0642418A27
      Card serial no. = 0006 12036855
uid           [ultimate] Example Fourth (Authenticate) <example.fourth@example.example>
Podle řádku "Card serial no. = 0006 12036855" můžeme usoudit, že klíč čtvrtý klíč je přesunutý na kartu. Jinak bychom to také poznali podle skromného indikátoru v podově znaku ">".

A podíváme se i na soubory.
tom@mike:~$ diff .gnupg/private-keys-v1.d/ .gnupg_orig/private-keys-v1.d/
Binary files .gnupg/private-keys-v1.d/C4EE06A7E2208178B43659AB57774A0642418A27.key and .gnupg_orig/private-keys-v1.d/C4EE06A7E2208178B43659AB57774A0642418A27.key differ
Velikost souboru se změnila z 1.9kB na 615 B. Soubor je sice binární, ale na začátku jsou nějaká písmenka. Zatímco původní soubor začíná řetězcem
(11:private-key(3:rsa(1:n513:
Tak po přesunu klíče máme
(20:shadowed-private-key(3:rsa(1:n513:

Šifrovací klíč

Teď zkusíme přesunout šifrovací klíč. Zvolíme si klíč s identitou "Second", který má podklíče, musíme proto zvolit správný klíč pro export (příkaz key 1)
tom@mike:~$ gpg --edit-key E2066568A1FB5723B550410D942AFD64430801F7
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/942AFD64430801F7
     created: 2020-05-24  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/8805963B89C93FE1
     created: 2020-05-24  expires: never       usage: E   
[ultimate] (1). Example Second (Second) <example.second@example.example>

gpg> key 1

sec  rsa4096/942AFD64430801F7
     created: 2020-05-24  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* rsa4096/8805963B89C93FE1
     created: 2020-05-24  expires: never       usage: E   
[ultimate] (1). Example Second (Second) <example.second@example.example>

gpg> keytocard
Please select where to store the key:
   (2) Encryption key
Your selection? 2

sec  rsa4096/942AFD64430801F7
     created: 2020-05-24  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* rsa4096/8805963B89C93FE1
     created: 2020-05-24  expires: never       usage: E   
[ultimate] (1). Example Second (Second) <example.second@example.example>
Opět si proklepneme výpisy. Je dobré doplnit přepínač --with-subkey-fingerprint, abychom mohli spárovat (pod)klíče s daty na kartě.
tom@mike:~$ gpg -K --with-keygrip --with-subkey-fingerprint
/home/tom/.gnupg/pubring.kbx
----------------------------
sec   rsa2048 2020-05-24 [SC] [expires: 2022-05-24]
      153130ED26CA404C8B29795B4703A5B671B96E4D
      Keygrip = 377C02935881630C7F4BA0807C8D753B6635CB90
uid           [ultimate] Example First <example.first@example.example>
ssb   rsa2048 2020-05-24 [E] [expires: 2022-05-24]
      AE19DF502047AAED7EDD98B3F1C6AE6DAF3AE8BF
      Keygrip = 383B2ACADA9228E29820F89A1C4A4F4D18408562
ssb   rsa4096 2020-05-24 [S]
      5ABA0105F9EEDE9BD0021DC08F2D5825D5689DE1
      Keygrip = E186137C42342AA7D3588183CC4B1FB6ED590E61

sec   rsa4096 2020-05-24 [SC]
      E2066568A1FB5723B550410D942AFD64430801F7
      Keygrip = 8590A9CA8F1385AD2984DD1ED501B1EDA947C90C
uid           [ultimate] Example Second (Second) <example.second@example.example>
ssb>  rsa4096 2020-05-24 [E]
      056841E37C4B42D1872BC8B78805963B89C93FE1
      Card serial no. = 0006 12036855
      Keygrip = 541540C36217BEED3F9147261B050026CB93166B

sec   rsa4096 2020-05-24 [SC]
      40DB1E1705A9B52E3EFBB29EDD41A31BA28D0199
      Keygrip = D6C7F494928F6EA71BE53DA60BDEBFA0FCBC6DB2
uid           [ultimate] Example Third (Third) <example.third@example.example>

sec>  rsa4096 2020-05-24 [CA]
      46C4F15BF45B274B155F9E08E815C1EA446EE732
      Keygrip = C4EE06A7E2208178B43659AB57774A0642418A27
      Card serial no. = 0006 12036855
uid           [ultimate] Example Fourth (Authenticate) <example.fourth@example.example>
Indikace, že (pod)klíč je na kartě, je opět provedena jenom skromným znaménkem ">" a ani nemáme informaci o seriovém čísle karty.
tom@mike:~$ gpg --card-status

Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006120368550000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 12036855
Name of cardholder: First Example
Language prefs ...: cz
Sex ..............: male
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: 0568 41E3 7C4B 42D1 872B  C8B7 8805 963B 89C9 3FE1
      created ....: 2020-05-24 20:22:25
Authentication key: 46C4 F15B F45B 274B 155F  9E08 E815 C1EA 446E E732
      created ....: 2020-05-24 21:10:10
General key info..: sub  rsa4096/8805963B89C93FE1 2020-05-24 Example Second (Second) <example.second@example.example>
sec   rsa4096/942AFD64430801F7  created: 2020-05-24  expires: never     
ssb>  rsa4096/8805963B89C93FE1  created: 2020-05-24  expires: never     
                                card-no: 0006 12036855
A ještě filesystém:
tom@mike:~$ diff .gnupg/private-keys-v1.d/ .gnupg_orig/private-keys-v1.d/
Binary files .gnupg/private-keys-v1.d/541540C36217BEED3F9147261B050026CB93166B.key and .gnupg_orig/private-keys-v1.d/541540C36217BEED3F9147261B050026CB93166B.key differ
Binary files .gnupg/private-keys-v1.d/C4EE06A7E2208178B43659AB57774A0642418A27.key and .gnupg_orig/private-keys-v1.d/C4EE06A7E2208178B43659AB57774A0642418A27.key differ
Změna souboru (velikost + úvodní text) je stejná jako v prvním případě.

Podepisovací klíč

Zkusíme exportovat podklíč z prvního klíče.
tom@mike:~$ gpg --edit-key 153130ED26CA404C8B29795B4703A5B671B96E4D
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa2048/4703A5B671B96E4D
     created: 2020-05-24  expires: 2022-05-24  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa2048/F1C6AE6DAF3AE8BF
     created: 2020-05-24  expires: 2022-05-24  usage: E   
ssb  rsa4096/8F2D5825D5689DE1
     created: 2020-05-24  expires: never       usage: S   
[ultimate] (1). Example First <example.first@example.example>

gpg> key 2

sec  rsa2048/4703A5B671B96E4D
     created: 2020-05-24  expires: 2022-05-24  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa2048/F1C6AE6DAF3AE8BF
     created: 2020-05-24  expires: 2022-05-24  usage: E   
ssb* rsa4096/8F2D5825D5689DE1
     created: 2020-05-24  expires: never       usage: S   
[ultimate] (1). Example First <example.first@example.example>

gpg> keytocard
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 1

sec  rsa2048/4703A5B671B96E4D
     created: 2020-05-24  expires: 2022-05-24  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa2048/F1C6AE6DAF3AE8BF
     created: 2020-05-24  expires: 2022-05-24  usage: E   
ssb* rsa4096/8F2D5825D5689DE1
     created: 2020-05-24  expires: never       usage: S   
[ultimate] (1). Example First <example.first@example.example>
A obligátní výpisy
tom@mike:~$ gpg -K --with-keygrip --with-subkey-fingerprint
/home/tom/.gnupg/pubring.kbx
----------------------------
sec   rsa2048 2020-05-24 [SC] [expires: 2022-05-24]
      153130ED26CA404C8B29795B4703A5B671B96E4D
      Keygrip = 377C02935881630C7F4BA0807C8D753B6635CB90
uid           [ultimate] Example First <example.first@example.example>
ssb   rsa2048 2020-05-24 [E] [expires: 2022-05-24]
      AE19DF502047AAED7EDD98B3F1C6AE6DAF3AE8BF
      Keygrip = 383B2ACADA9228E29820F89A1C4A4F4D18408562
ssb>  rsa4096 2020-05-24 [S]
      5ABA0105F9EEDE9BD0021DC08F2D5825D5689DE1
      Card serial no. = 0006 12036855
      Keygrip = E186137C42342AA7D3588183CC4B1FB6ED590E61

sec   rsa4096 2020-05-24 [SC]
      E2066568A1FB5723B550410D942AFD64430801F7
      Keygrip = 8590A9CA8F1385AD2984DD1ED501B1EDA947C90C
uid           [ultimate] Example Second (Second) <example.second@example.example>
ssb>  rsa4096 2020-05-24 [E]
      056841E37C4B42D1872BC8B78805963B89C93FE1
      Card serial no. = 0006 12036855
      Keygrip = 541540C36217BEED3F9147261B050026CB93166B

sec   rsa4096 2020-05-24 [SC]
      40DB1E1705A9B52E3EFBB29EDD41A31BA28D0199
      Keygrip = D6C7F494928F6EA71BE53DA60BDEBFA0FCBC6DB2
uid           [ultimate] Example Third (Third) <example.third@example.example>

sec>  rsa4096 2020-05-24 [CA]
      46C4F15BF45B274B155F9E08E815C1EA446EE732
      Keygrip = C4EE06A7E2208178B43659AB57774A0642418A27
      Card serial no. = 0006 12036855
uid           [ultimate] Example Fourth (Authenticate) <example.fourth@example.example>


tom@mike:~$ diff .gnupg/private-keys-v1.d/ .gnupg_orig/private-keys-v1.d/
Binary files .gnupg/private-keys-v1.d/541540C36217BEED3F9147261B050026CB93166B.key and .gnupg_orig/private-keys-v1.d/541540C36217BEED3F9147261B050026CB93166B.key differ
Binary files .gnupg/private-keys-v1.d/C4EE06A7E2208178B43659AB57774A0642418A27.key and .gnupg_orig/private-keys-v1.d/C4EE06A7E2208178B43659AB57774A0642418A27.key differ
Binary files .gnupg/private-keys-v1.d/E186137C42342AA7D3588183CC4B1FB6ED590E61.key and .gnupg_orig/private-keys-v1.d/E186137C42342AA7D3588183CC4B1FB6ED590E61.key differ
Soubor se změnil jako v předchozích případech.

Teď zkusíme něco podepsat. Mám na flashce nějaké staré verze textu minulého dílu:
tom@mike:~$ gpg --detach-sign -a /media/tom/DTEG2_64GB/clanky/sifrovani.odt
vytvoří se soubor /media/tom/DTEG2_64GB/clanky/sifrovani.odt.asc, jehož obsah vypadá nějak takto:
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEWroBBfnu3pvQAh3Ajy1YJdVoneEFAl7ehucACgkQjy1YJdVo
neGZWw/+LiDDbtv42nooVfcTAFy0rMcwepn0aszCxfTlLMkBDHgVHHbBVrA+GWPF
l7iki+dd7WhzcRC2ddnevRK3PACq8XaKTWMRKrC+khbd/K/K7GDKISagyZZEfGHg
osVgB9kFpd0PBr6pPjanGSa+Hc4+4LhXRafSOtpWHIBY7JgQRvRSsq561sG/U1UV
1sCo0YYAqJW7doPLRBIYdPRpW1osoGenIJDFP2uV3AN78Jt3XteECu798b/Rlg4O
5xPl/vPkGKZLDfS5hA+8GUSvWr7Vr7e/GuxN3qrp9I49hrDTFDr2WsJxl5Fi4bx5
jk74FgT0A8Fs2NJjCJNx+qmeNCU3iX3h4geDFMHtc8cCzRMX30E09RB6LP6q6dzJ
iVKbltalZFqi1+yR232YpKeM7D9EY48JtVzh2s9MoPCxdbCKdD5nQsyX0b2pvB/W
MO8emi1vWMX4UlZphSb84FVvCBRDiwp8fTZ9jpoaQVrUvm0/9CvUNZo62MVL5mNx
sPnpe06xvQXqN+fDGR1cN00KbtheY5nSdpl3mNHDkhbLTQbjXeiq6fCzTOzoIoaa
xC4oeLUhGrbU6bAAT/EiDWTVfotYc6FQWZgwWFQSo+yw8+SNc3Nb8TveQ3pu0/3C
tBKOJ6aggNYlaIqPH6cMNq4tmhrLQTJ0HI7jNRdsSUjlpvfsxdY=
=uUz/
-----END PGP SIGNATURE-----
Všiml jsem si, že se soubor podepsal hned a nečekal na ťuknutí prstem. K tomu se vrátím později.

Vytáhneme Yubikey5 a zkusíme podepsat znovu.
tom@mike:~$ gpg --detach-sign -a /media/tom/DTEG2_64GB/clanky/sifrovani.odt
Vyskočí na nás velmi otravné okno s textem
Please insert the card with serial number:
"D2760001240103040006120368550000"
To číslo jsme už viděli na začátku, jenom se mu říkalo Application ID.

Nastavení dotyku na Yubikey

V základním nastavení Yubikey vyžaduje dotyk pro dvoufaktorovou autentizaci, ale pro práci s klíči ji nevyžaduje. Dá se ovšem nastavit.

Navštívíme stránku https://developers.yubico.com/PGP/Card_edit.html, kde si najdeme odkaz na shellový skript https://github.com/a-dma/yubitouch. Na stránce jsou popsány závislosti skriptu. Skript si stáhneme, uložíme na vhodné místo (třeba ~/bin) a nastavíme mu práva na spuštění.

Potom stačí napsat:
~/bin/yubitouch.sh sig on 12345678
To číslo na konci je Admin PIN. Když ho nezadáte, tak se zeptá. Je v tom nějaká alchymie, protože mi to několikrát zahlásilo
Verification failed, wrong pin?
Nakonec to ale prošlo. O nastavení se můžeme převědčit pomocí příkazu:
tom@mike:~$ ~/bin/yubitouch.sh sig get
Current sig touch setting: on
Když se znovu pokusíme něco podepsat, Yubikey se na nás rozbliká na znamení, že čeká na naší reakci.

Je potřeba držet prst trošku déle, dokud neuvidíte, že GPG doběhlo. Může to být i několik sekund.

Stejně si nastavíme, že vyžadujeme dotyk i pro ostatní akce
tom@mike:~$ ~/bin/yubitouch.sh aut on 12345678
All done!
tom@mike:~$ ~/bin/yubitouch.sh dec on 12345678
All done!
Podrobné informace o možných akcích najdete na výše zmíněné stránce.

Pokusy s druhým Yubikey

Teď jsem ve slotu vyměnil černý Yubikey5 za Yubikey nano. Ono je vcelku jedno, který typ, důležité je, že to je jiný kus.

Zobrazíme si informace o kartě
tom@mike:~$ gpg --card-status
Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006105300770000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 10530077
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
Jak vidíme, Application ID i Serial number se liší.

Teď zkusíme přeunout na kartu již přesunutý klíč. Samozřejmě očekávám, že to skončí chybou.
tom@mike:~$ gpg --edit-key 46C4F15BF45B274B155F9E08E815C1EA446EE732
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/E815C1EA446EE732
     created: 2020-05-24  expires: never       usage: CA  
     card-no: 0006 12036855
     trust: ultimate      validity: ultimate
[ultimate] (1). Example Fourth (Authenticate) <example.fourth@example.example>

gpg> keytocard
Really move the primary key? (y/N) y
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 3
gpg: KEYTOCARD failed: Unusable secret key
Přiznám se, že kdybych něvěděl, co jsem tropil, tak bych z hlášky nepochopil, v čem je problém.

Teď ze zálohy obnovím adresář .gnupg a zkusím znovu přesunout stejný klíč.
tom@mike:~$ gpg --edit-key 46C4F15BF45B274B155F9E08E815C1EA446EE732
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/E815C1EA446EE732
     created: 2020-05-24  expires: never       usage: CA  
     trust: ultimate      validity: ultimate
[ultimate] (1). Example Fourth (Authenticate) <example.fourth@example.example>

gpg> keytocard
Really move the primary key? (y/N) y
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 3

sec  rsa4096/E815C1EA446EE732
     created: 2020-05-24  expires: never       usage: CA  
     trust: ultimate      validity: ultimate
[ultimate] (1). Example Fourth (Authenticate) <example.fourth@example.example>

tom@mike:~$ gpg -K --with-keygrip
/home/tom/.gnupg/pubring.kbx
----------------------------
sec   rsa2048 2020-05-24 [SC] [expires: 2022-05-24]
      153130ED26CA404C8B29795B4703A5B671B96E4D
      Keygrip = 377C02935881630C7F4BA0807C8D753B6635CB90
uid           [ultimate] Example First <example.first@example.example>
ssb   rsa2048 2020-05-24 [E] [expires: 2022-05-24]
      Keygrip = 383B2ACADA9228E29820F89A1C4A4F4D18408562
ssb   rsa4096 2020-05-24 [S]
      Keygrip = E186137C42342AA7D3588183CC4B1FB6ED590E61

sec   rsa4096 2020-05-24 [SC]
      E2066568A1FB5723B550410D942AFD64430801F7
      Keygrip = 8590A9CA8F1385AD2984DD1ED501B1EDA947C90C
uid           [ultimate] Example Second (Second) <example.second@example.example>
ssb   rsa4096 2020-05-24 [E]
      Keygrip = 541540C36217BEED3F9147261B050026CB93166B

sec   rsa4096 2020-05-24 [SC]
      40DB1E1705A9B52E3EFBB29EDD41A31BA28D0199
      Keygrip = D6C7F494928F6EA71BE53DA60BDEBFA0FCBC6DB2
uid           [ultimate] Example Third (Third) <example.third@example.example>

sec>  rsa4096 2020-05-24 [CA]
      46C4F15BF45B274B155F9E08E815C1EA446EE732
      Keygrip = C4EE06A7E2208178B43659AB57774A0642418A27
      Card serial no. = 0006 10530077
uid           [ultimate] Example Fourth (Authenticate) <example.fourth@example.example>
Jak se dalo čekat, teď už to dopadlo dobře. GPG má poznamenáno, že klíč je na druhé kartě.

A nakonec si ukážeme factory reset.
tom@mike:~$ gpg --edit-card

Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240103040006105300770000
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 10530077
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: 46C4 F15B F45B 274B 155F  9E08 E815 C1EA 446E E732
      created ....: 2020-05-24 21:10:10
General key info..: pub  rsa4096/E815C1EA446EE732 2020-05-24 Example Fourth (Authenticate) <example.fourth@example.example>
sec>  rsa4096/E815C1EA446EE732  created: 2020-05-24  expires: never     
                                card-no: 0006 10530077

gpg/card> help
quit           quit this menu
admin          show admin commands
help           show this help
list           list all available data
fetch          fetch the key specified in the card URL
passwd         menu to change or unblock the PIN
verify         verify the PIN and list all data
unblock        unblock the PIN using a Reset Code

gpg/card> admin
Admin commands are allowed

gpg/card> help
quit           quit this menu
admin          show admin commands
help           show this help
list           list all available data
name           change card holder's name
url            change URL to retrieve key
fetch          fetch the key specified in the card URL
login          change the login name
lang           change the language preferences
sex            change card holder's sex
cafpr          change a CA fingerprint
forcesig       toggle the signature force PIN flag
generate       generate new keys
passwd         menu to change or unblock the PIN
verify         verify the PIN and list all data
unblock        unblock the PIN using a Reset Code
factory-reset  destroy all keys and data

gpg/card> factory-reset
gpg: OpenPGP card no. D2760001240103040006105300770000 detected

gpg: Note: This command destroys all keys stored on the card!

Continue? (y/N) y
Really do a factory reset? (enter "yes") yes
Celá operace nechtěla PIN. Takže myslete na to, že kdokoliv, komu dáte token do ruky, vám může smazat celou kartu.

2 tokeny najednou

Ještě jsem zkusil zasunout 2 tokeny najednou a vypsat informace. Zkoušel jsem různé pořadí zasunutí a vždy se vypsal informace ke stejnému tokenu (v mém případě Yubikey nano). Nenašel jsem postup, jak vypsat všechny karty, případně zvolit kartu. Starší návody nefungovaly. Možná to souvisí s tím, že oba tokeny se hlásí jako stejný Reader. Od verze 2.1.20 je to prý pořešené (https://dev.gnupg.org/T1621)

Závěr

Původně jsem si myslel, že to šifrování bude jednodušší. Zejména jsem si tedy myslel, že klíče uložím na tokenu a pak ho můžu zastrčit do libovolného počítače a použít. Bohužel to tak není možné, je potřeba mít nakonfigurované GPG. Pokud je potřeba používat token na vícero počítačích, musí se na každý z nich nakopírovat stejnou konfiguraci. V tom případě by asi bylo dobré nosit s sebou i flashku s konfigurací, nebo raději také nějakou portable verzi GPG.

Dále mi vrtá hlavou, jak to udělat, pokud chci mít záložní token. Zatím mi vychází, že musím udržovat dvě verze konfigurace, protože GPG si drží sériové číslo karty. Pokud víte o nějakém nekalém postupu, který by problém vyřešil, napište ho do komentáře.

Nezkoumal jsem konkurenční produkty. Je možné, že pro potřeby používání GPG by se líp hodilo i něco jiného.

Někdy bych se chtěl ještě podívat, jak se dá Yubico použít k autentizaci SSH. Zatím mě k tomu nic netlačí, takže to nebude brzo.        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

14.6.2020 11:23 pavele
Rozbalit Rozbalit vše Re: GPG a Yubikey
Odpovědět | Sbalit | Link | Blokovat | Admin
https://www.abclinuxu.cz/hardware/prislusenstvi/podle-sbernice/usb/krypto/yubikey-neo

Ovšem dnes bych se na to vykašlal a zkusil bych spíš PKCS#11.

Jediná výhoda je jednoduché použití ve Windows pomocí upraveného paegant:

http://smartcard-auth.de/download-en.html
14.6.2020 13:25 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: GPG a Yubikey
Odpovědět | Sbalit | Link | Blokovat | Admin
autentizační klíč. Podle dokumentace (https://www.gnupg.org/howtos/card-howto/en/ch03.html) ho sice GPG nepoužívá

Může ho používat např. gpg-agent pro ssh autentizaci. Není to sice přímo příkaz gpg, ale je součástí stejného projektu a obvykle i stejného balíčku.

15.7.2020 22:36 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: GPG a Yubikey
Odpovědět | Sbalit | Link | Blokovat | Admin
Ještě jsem zkusil zasunout 2 tokeny najednou a vypsat informace. Zkoušel jsem různé pořadí zasunutí a vždy se vypsal informace ke stejnému tokenu (v mém případě Yubikey nano). Nenašel jsem postup, jak vypsat všechny karty, případně zvolit kartu.

Tak zrovna s tímhle jsem si dneska naběhl. Token, který mi na hlavním počítači bezproblémově fungoval, jsem chtěl vyzkoušet v notebooku a nedokázal jsem ho donutit ke spolupráci, pořád mi to tvrdilo, že "Takové zařízení neexistuje". Po asi půlhodině usilovného debugování (během které jsem se od gpg přes gpg-agent dostal až k scdaemon) mi došlo, že "Broadcom Corp 5880 [Contacted SmartCard]" je čtečka smart karet vestavěná v tom notebooku, kterou jsem nikdy k ničemu praktickému nepoužil a tudíž jsem zapomněl, že tam vůbec je. Ten scdaemon si ji automaticky vybral a protože v ní žádná karta nebyla, skončilo to chybou.

Pak ještě následovalo hledání v dokumentaci a experimentování se správnou syntaxí. Nakonec jsem skončil se souborem ~/.gnupg/scdaemon.conf obsahujícím řádek

  reader-port Nitrokey Nitrokey Pro (000000000000000000007F04) 01 00

S tím už všechno funguje jak má.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.