專文 10 / 數位

把秘密留在機器之外

從不坐在日常筆電上的 OpenPGP 認證金鑰,和密碼管理器裡的一串口令,是不同物件。

本譯文版本尚待母語編輯審閱。

斷開連接的低壓電路板、萬用電表探針和空電池盒整齊排列,準備進行故障診斷。
故障範圍愈小,問題愈容易回答。原創插畫場景。

當問題是「能否認證、簽署、加密、驗證,而不把私密材料交給供應商」時,我仍伸手拿 GnuPG。上手以難著稱。那不是跳過的理由,而是把主密鑰當成稀有離線物件、日常工作用子鑰的理由。

這是專家路徑。若要較小的現代預設,檔案用 age、登入用 SSH,能走很遠。需要認證之網、郵件、git 簽名、以及能放抽屜的金鑰時,OpenPGP 才賺到它的鬍子。

基礎 · 金鑰在這裡做什麼

公鑰可公開。私鑰必須在你控制下。認證說「這身分配這把鑰」。簽署、加密、驗證(例如經 gpg-agent 的 SSH)可分到子鑰,讓最危險的秘密——能鑄造其他鑰的那把——不活在你帶上火車的筆電上。

一把僅認證的主鑰,然後三份工作

我使用、並寫在 GnuPG Keys Management 的安排:僅 certify 的主鑰;簽署、加密、驗證三把子鑰;主密鑰在加密可攜媒介上再從日常電腦刪除;子鑰可選放到 OpenPGP 智慧卡。GnuPG 目前預設偏 ECC。合理。當我要保守、廣為理解的主鑰時,仍產生大型 RSA 認證鑰。不要把密語貼進批次範本。用完整指紋,絕不用短 ID。

gpg --list-secret-keys --fingerprint --with-keygrip

匯出,證明匯出,然後刪

匯出指令不是備份。刪任何東西前,還原進 RAM 裡的拋棄式 home。你要 sec(不是 sec#)以及真正的 ssbgpg --list-packets 會顯示 gnu-dummygnu-divert-to-card 若你匯出了 stub。

umask 077
TEST_GNUPGHOME="$(mktemp -d /dev/shm/gnupg-test.XXXXXX)"
gpg --homedir "$TEST_GNUPGHOME" --import ./primary.private-key.sec
gpg --homedir "$TEST_GNUPGHOME" --list-secret-keys --fingerprint

引號裡的 ! 只選主鑰。之後日常鑰匙圈顯示 sec#。子鑰在 YubiKey 上時期待 ssb>

使用離線主鑰

認證——加 uid、簽別人的鑰、做新子鑰——表示掛上加密磁碟,最好用乾淨的 GNUPGHOME。然後卸載。簽署 git 提交的筆電不該能鑄造新身分。

中階 · 若你還沒準備好離線主鑰

那就不要假裝。產生有到期日的 Ed25519/Cv25519,把撤銷憑證放在磁碟死後找得到的地方,把 ~/.gnupg 備份到真的還原過的加密媒介。不需要 OpenPGP 信任網時,age 加密檔案更乾淨。稍後可以升級到離線認證鑰。你無法「取消洩漏」在筆電包裡坐了三年的主鑰。

這不是什麼

不是在郵務清單上加密笑話的教學。不是人人必須 RSA-8192 的論證。它是一把金鑰的形狀:最危險的部分能放抽屜,日常部分能替換,復原在需要之前已在 /dev/shm 看過能動。

gpg --delete-secret-keys "${FINGERPRINT}!"
gpg --list-secret-keys "$FINGERPRINT"
gpgconf --list-dirs homedir

實務上,請把命令、摺疊段落與英文原稿對齊;翻譯負責說明,證據仍以可執行的指令為準。若某一層對你來說太深,先停在中階,把演練做完再往下。

下一篇專文 回到開頭 ↑