gpg subkey 用法

為什麼要用subkey? 你想過要怎麼安全的使用 gpg key 在不同的電腦之間嘛?

不同的電腦需要同一把 key 作簽章加解密,你要怎麼傳輸你的 key 萬一。曾經幹過的蠢事

scp -r .gnupg $IP:~/

為什麼要冒這麼大的風險呢?明明有subkey阿!所以絕對不要再這樣幹了!

不同電腦操作可以儘量用子鑰組,如果遺失可以個別revoke,但是人際關係紀錄還會保留住;萬一主鑰遺失,revoke之後,人際關係紀錄就沒了。

正確解法應該是產生子鑰(subkey),傳輸子鑰到別的電腦,匯入子鑰,就可以正常使用gpg了。 裏面一些重點重申,鑰匙都是一對的,就是公鑰和私鑰,一般gen好就是主鑰 或稱之 母鑰組;可以用addkey去產生各種不同用途的子鑰組,其中一樣也包含公鑰和私鑰。

使用指令 gpg -K 會列出所有私鑰

sec => 'SECret key' 私鑰
pub => 'PUBlic key' 公鑰
ssb => 'Secret SuBkey' 子私鑰
sub => 'public SUBkey' 子公鑰

用說的很快,實作就是:

建議的 gpg.conf:

personal-digest-preferences SHA512 
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed 
cert-digest-algo SHA512

產生 key, gpg --genkey

:$ gpg --genkey
gpg (GnuPG) 1.4.18; Copyright (C) 2014 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.

請選擇你要使用的金鑰種類:
   (1) RSA 和 RSA (預設)
   (2) DSA 和 Elgamal
   (3) DSA (僅能用於簽署)
   (4) RSA (僅能用於簽署)
你要選哪一個? 1
RSA 金鑰的長度可能介於 1024 位元和 4096 位元之間.
你想要用多大的金鑰尺寸? (2048) 4096
你所要求的金鑰尺寸是 4096 位元
請指定這把金鑰的有效期限是多久.
         0 = 金鑰不會過期
      <n>  = 金鑰在 n 天後會到期
      <n>w = 金鑰在 n 週後會到期
      <n>m = 金鑰在 n 月後會到期
      <n>y = 金鑰在 n 年後會到期
金鑰的有效期限是多久? (0) 0
金鑰完全不會過期
以上正確嗎? (y/N) y

你需要一個使用者 ID 來辨識你的金鑰; 這個軟體會用真實姓名,
註釋和電子郵件地址組合成使用者 ID 如下:
    "Ke-Huan Lin (Jedi) <Jedi@Jedi.org>"

真實姓名: Yu-Chin Tsai
電子郵件地址: thomas at_ nchc.org.tw
註釋: testkey
你選擇了這個使用者 ID:
    "Yu-Chin Tsai (testkey) <thomas _at nchc.org.tw>"

變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? O
你需要一個密語來保護你的私鑰.

我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數.

隨機位元組不夠多. 請多做一些有的沒的事情, 
這樣作業系統纔能蒐集到更多的亂數! (還需要 197 位元組)
..+++++

隨機位元組不夠多. 請多做一些有的沒的事情, 
這樣作業系統纔能蒐集到更多的亂數! (還需要 250 位元組)
......+++++    
gpg: 金鑰 60929ECF 已標記成徹底信任了
公鑰和私鑰已建立及簽署.

gpg: 正在檢查信任資料庫
gpg: 3 個勉強信任以及 1 個完全信任是 PGP 信任模型的最小需求
gpg: 深度: 0  有效:   1  已簽署:   0  信任: 0-, 0q, 0n, 0m, 0f, 1u
pub   4096R/60929ECF 2015-05-15
      金鑰指紋 = 8293 78B2 E1F0 C7B4 08E3  A44F 02DC 2135 6092 9ECF
uid                  Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>
sub   4096R/2E4511D2 2015-05-15

列出gen好的key來看看:

:$ gpg --list-key
/home/thomas/tmp/testgg//pubring.gpg
------------------------------------
pub   4096R/60929ECF 2015-05-15
uid                  Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>
sub   4096R/2E4511D2 2015-05-15

增加子鑰 subkey: gpg --edit ...

:$ gpg  --edit-key 60929ECF
gpg (GnuPG) 1.4.18; Copyright (C) 2014 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.

私鑰可用.

pub  4096R/60929ECF  建立: 2015-05-15  到期: 永遠不過期  用途: SC  
                     信任: 徹底        有效性: 徹底
sub  4096R/2E4511D2  建立: 2015-05-15  到期: 永遠不過期  用途: E   
[  徹底  ] (1). Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>

用 addkey 指令增加 subkey

gpg> addkey
金鑰已保護.

你需要用密語來解開下列使用者的
私鑰: "Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>"
4096 位元長的 RSA 金鑰, ID 60929ECF, 建立於 2015-05-15

請選擇你要使用的金鑰種類:
   (3) DSA (僅能用於簽署)
   (4) RSA (僅能用於簽署)
   (5) Elgamal (僅能用於加密)
   (6) RSA (僅能用於加密)
你要選哪一個? 4
RSA 金鑰的長度可能介於 1024 位元和 4096 位元之間.
你想要用多大的金鑰尺寸? (2048) 4096
你所要求的金鑰尺寸是 4096 位元
請指定這把金鑰的有效期限是多久.
         0 = 金鑰不會過期
      <n>  = 金鑰在 n 天後會到期
      <n>w = 金鑰在 n 週後會到期
      <n>m = 金鑰在 n 月後會到期
      <n>y = 金鑰在 n 年後會到期
金鑰的有效期限是多久? (0) 2
金鑰將會在 2015年05月17日 (週日) 17時25分13秒 CST 到期
以上正確嗎? (y/N) y
真的要建立嗎? (y/N) y
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數.

隨機位元組不夠多. 請多做一些有的沒的事情, 
這樣作業系統纔能蒐集到更多的亂數! (還需要 190 位元組)
...+++++

pub  4096R/60929ECF  建立: 2015-05-15  到期: 永遠不過期  用途: SC  
                     信任: 徹底        有效性: 徹底
sub  4096R/2E4511D2  建立: 2015-05-15  到期: 永遠不過期  用途: E   
sub  4096R/4871B3C5  建立: 2015-05-15  到期: 2015-05-17  用途: S   
[  徹底  ] (1). Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>

gpg> save

最後用 save 存檔就完成子鑰增加的動作了。子鑰就是之後會被傳送到不是絕對安全的機器上操作,例如筆記型電腦..., 萬一真的被盜用,我們需要一份憑證,告訴大家,那就是撤銷憑證。

:$ gpg --output 60929ECF.gpg.revocation-certificate --gen-revoke 60929ECF

sec  4096R/60929ECF 2015-05-15 Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>

要為這把金鑰建立一份撤銷憑證嗎? (y/N) y
請選擇撤銷的原因:
  0 = 未指定原因
  1 = 金鑰已經被洩漏了
  2 = 金鑰被代換了
  3 = 金鑰不再被使用了
  Q = 取消
(也許你會想要在這裡選擇 1)
你的決定是甚麼? 1
請輸入選用的描述; 以空白列結束:
> This revocation certificate was generated when the key was created.
>
撤銷原因: 金鑰已經被洩漏了
....
這樣可以嗎? (y/N) y

你需要用密語來解開下列使用者的
私鑰: "Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>"
4096 位元長的 RSA 金鑰, ID 60929ECF, 建立於 2015-05-15

已強迫使用 ASCII 封裝過的輸出.
已建立撤銷憑證.

請把這個檔案搬移到另一個你能夠將之藏起來的媒介上;
如果有人能夠取得這份憑證的話, 那麼他也能夠讓你的
金鑰無法繼續使用. 把這份憑證列印出來再藏到別的地
方也是很好的方法, 以免你的儲存媒介損毀而無法讀取.
但是千萬小心: 你的機器上的列印系統可能會在列印過
程中把這些資料暫存在某個其他人也能夠看得到的地方!

現在開始移轉的程序,把整個目錄備份到加密隨身碟

umask 077; tar -cf /media/encrypted-usb/gnupg-backup-new.tar -C $HOME .gnupg

把私子鑰匯出到加密隨身碟,以後其他台電腦可以用這一份來操作。

:$ gpg --export-secret-subkeys 60929ECF > /media/encrypted-usb/subkeys

系統中的私母鑰已經用不到了(記得加密隨身碟也有一份吧 不要遺失摟,未來還會用的到),如果是信的過的機器,為了方便當然可以不刪,但是我建議只有一台電腦有就好。

:$ gpg --delete-secret-key  60929ECF
gpg (GnuPG) 1.4.18; Copyright (C) 2014 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.


sec  4096R/60929ECF 2015-05-15 Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>

要從鑰匙圈裡刪除這把金鑰嗎? (y/N) y
這是一把私鑰! - 真的要刪除嗎? (y/N) y

重新匯入私子鑰

:$ gpg --import /media/encrypted-usb/subkeys
:$ shred -u /media/encrypted-usb/subkeys

用 gpg -K 確認,如果有出現符號 "#" 在前面表示遺失,這樣就正確了!

:$ gpg -K
/home/thomas/tmp/testgg//secring.gpg
------------------------------------
sec#  4096R/60929ECF 2015-05-15
uid                  Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>
ssb   4096R/2E4511D2 2015-05-15
ssb   4096R/4871B3C5 2015-05-15

測試sign

:$ gpg --clearsign file

你需要用密語來解開下列使用者的
私鑰: "Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>"
4096 位元長的 RSA 金鑰, ID 4871B3C5, 建立於 2015-05-15 (主要金鑰 ID 60929ECF)

驗證sign

:$ gpg --verify file.asc 
gpg: 由 2015年05月15日 (週五) 17時35分52秒 CST 建立的簽章, 使用 RSA 金鑰 ID 4871B3C5
gpg: 完好的簽章來自於 "Yu-Chin Tsai (testkey) <thomas_at_nchc.org.tw>"

移轉過程就是把加密隨身碟拿到另一台電腦,例如筆記型電腦,掛載加密隨身碟之後,import subkey

https://www.void.gr/kargig/blog/2013/12/02/creating-a-new-gpg-key-with-subkeys/

Comments