專文 11 / 數位

[YubiKey - OpenPGP] 權杖不是秘密

使用硬體權杖執行日常 OpenPGP 操作,保存已測試的鑰匙備份,並在遺失裝置前規劃帳號復原。

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

打開的共用工具櫃裡有使用過的手工具、空白借用牌、空掛鉤與保養用品。
共享取用,有賴共同維護。原創插畫場景。

OpenPGP 硬體權杖可在日常使用時保護私密子鑰。簽署、解密與身分驗證在裝置上執行,裝置不提供私鑰匯出。若遺失裝置,復原就必須依靠匯入前製作的備份,或另一個已載入相同鑰匙的裝置。

本文說明如何在 YubiKey 上使用 OpenPGP 子鑰。依照把秘密留在機器之外的方式離線保存認證主鑰。先產生並備份日常子鑰,再移至卡片。直接在卡片上產生的鑰匙無法備份成檔案。

匯入鑰匙前先設定卡片。變更 OpenPGP 出廠使用者 PIN(123456)與管理員 PIN(12345678),並設定重設碼。透過互動提示輸入憑證。ykman openpgp reset 與 ykman piv reset 會清除各自應用程式及儲存的鑰匙,屬於復原或重新配置操作,並非一般初始化步驟。

基礎 · 區分鑰匙保護與復原

電腦將操作交給卡片執行,而非讀取私鑰。PIN 授權存取。觸碰政策要求使用鑰匙時進行實體互動,但無法告訴你操作是否正當。

PIN 與觸碰都不提供復原能力。若沒有加密私鑰備份,遺失卡片可能讓既有加密資料無法讀取。離線主鑰可簽發替代子鑰,但無法重建遺失的加密私鑰。

確認使用的應用程式

YubiKey 可支援多種應用程式,實際功能依型號而異。各應用程式的憑證與復原程序不同:

YubiKey
├── OpenPGP
│   ├── User PIN
│   ├── Reset Code
│   └── Admin PIN
├── PIV
│   ├── PIN
│   ├── PUK
│   └── Management Key
├── FIDO2
├── OATH
└── OTP
  • OpenPGP:透過 GnuPG 簽署、解密與驗證身分。
  • PIV:憑證式智慧卡身分驗證,具有獨立的 PIN、PUK 與管理金鑰。
  • FIDO2 / U2F:向網站及相容服務驗證身分。復原取決於各服務已註冊的憑證與復原方式。

僅支援 FIDO 的權杖無法保存這些 OpenPGP 子鑰。請檢查 OpenPGP 應用程式,確認簽署鑰匙的位置:

gpg --card-status
gpg --list-secret-keys --fingerprint

ssb> 表示 GnuPG 參照智慧卡上的子鑰。ssb 表示本機有可用的私密子鑰資料。卡片參照只描述目前的鑰匙圈,不能證明沒有檔案備份或其他本機副本。

進階 · 檢查裝置並設定存取

修改設定前先檢查裝置。記錄型號、序號、韌體版本及支援的鑰匙演算法,並確認所選子鑰相容:

ykman list
ykman info
ykman openpgp info
ykman piv info
gpg --card-status

OpenPGP 使用者 PIN 授權使用鑰匙。管理員 PIN 控制管理操作。重設碼可解除使用者 PIN 的封鎖。透過 GnuPG 互動選單變更憑證:

gpg --card-edit
gpg/card> admin
gpg/card> passwd
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code

依需求設定重試上限。YubiKey NEO 變更此設定會將 PIN 重設為出廠值,之後必須再次變更 PIN。Yubico API 參考。此範例允許使用者 PIN 五次、重設碼三次、管理員 PIN 六次。確認顯示的計數器:

ykman openpgp access set-retries 5 3 6
ykman openpgp info
gpg --card-status

預期順序為使用者 PIN/重設碼/管理員 PIN:5 3 6。使用者 PIN 遭封鎖時,可透過適當的復原憑證重設。若管理存取遭封鎖且必須重設應用程式,儲存的鑰匙會被清除。

要求簽署、解密與身分驗證時觸碰裝置。使用 on,讓政策仍可調整。確認已安裝的 ykman 接受哪個加密插槽名稱;不同版本可能使用 dec 或 enc。匯入鑰匙後重新套用並確認政策。YubiKey Manager OpenPGP 參考。

ykman openpgp keys set-touch sig on
ykman openpgp keys set-touch dec on
ykman openpgp keys set-touch aut on
ykman openpgp info

若也使用 PIV,請另行設定。其出廠 PIN 是 123456,PUK 是 12345678;請變更兩者與預設管理金鑰。變更 PIV 重試上限會將 PIN 與 PUK 重設為出廠值,因此先設定重試上限。

對於 PIV 管理金鑰,可使用韌體支援的演算法產生隨機金鑰並安全保存於裝置外,或用 ykman piv access change-management-key --protect 在裝置上產生並保存受 PIN 保護的金鑰。這些選項管理 PIV 存取,都不會備份 OpenPGP 鑰匙。YubiKey Manager PIV 參考。

ykman info
ykman openpgp info
ykman piv info
gpg --card-status

移動子鑰前先測試備份

卡片無法匯出已匯入的 OpenPGP 私鑰。依賴它之前先完成以下步驟:

  1. 將主鑰與子鑰的私密資料匯出至加密裝置。
  2. 在獨立且可信任的鑰匙圈還原備份,並測試必要操作。僅使用 /dev/shm 鑰匙圈不會讓電腦離線,也不會阻止 swap。
  3. 設定卡片憑證及重試上限。
  4. 用 keytocard 移動日常子鑰。
  5. 重新套用觸碰政策,確認日常鑰匙圈顯示 sec# 與 ssb>。
  6. 測試卡片,接著拔除它,再測試從備份或另一張已配置卡片復原。

將加密備份與權杖分開存放。沒有已測試的復原路徑,權杖仍是單點故障來源。

進階 · 將各子鑰移至對應插槽

使用主鑰的完整指紋。依編號選取前先確認實際子鑰順序。從只含私密子鑰的鑰匙圈操作,讓主鑰維持離線。除非已計畫更換且能復原,否則不要覆寫卡片既有插槽。

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

key N 會切換選取狀態。先取消目前子鑰,再選下一把。將簽署子鑰移至簽署插槽、加密子鑰移至解密插槽、身分驗證子鑰移至身分驗證插槽。確認每次選擇,完成後用 save 儲存。

重新套用觸碰政策並檢查卡片:

ykman openpgp keys set-touch sig on
ykman openpgp keys set-touch dec on
ykman openpgp keys set-touch aut on
ykman openpgp info
gpg --card-status

日常鑰匙圈應顯示主鑰不可用,且子鑰位於卡片。以下為示意輸出:

sec#  rsa8192/A567B3B17C27BF6D  created: 2020-01-12  expires: never
ssb>  rsa4096/51D88833772723AD  created: 2020-01-12  expires: 2030-01-12
                                card-no: 0000 00000000
ssb>  rsa4096/8C7587C86EAC2F2F  created: 2020-01-12  expires: 2030-01-12
                                card-no: 0000 00000000
ssb>  rsa4096/D13AE6B65E8BE723  created: 2020-01-12  expires: 2030-01-12
                                card-no: 0000 00000000

連接卡片後,簽署、加密並解密不含敏感資料的測試檔案。將收件者換成自己的測試身分:

gpg --encrypt --sign --armor -r something@something message.txt
gpg --decrypt message.txt.asc

若使用身分驗證子鑰,請對隔離帳號測試。接著拔除原卡片。在另一台可信任電腦或隔離鑰匙圈匯入備份,重做簽署並解密同一測試檔案。確認簽章與還原內容。若復原使用第二張卡片,測試時應拔除第一張。

為各應用程式規劃復原

主鑰備份與撤銷憑證必須在沒有日常權杖時仍可取得。若遺失權杖,依情況撤銷受影響的 OpenPGP 子鑰,並發布更新後的公開憑證。替代子鑰能恢復未來使用;舊資料仍需原本的加密私鑰才能解密。

對 FIDO 帳號,在遺失第一個驗證器前先註冊第二個,或設定另一種受支援的復原方式。備用驗證器必須在各服務分別註冊。複製 OpenPGP 子鑰不會複製 FIDO 憑證。分別檢查網域註冊商、信箱與 Git 主機的復原方式。

FIDO 驗證透過與服務的綁定提供防網路釣魚能力。OpenPGP 身分驗證與觸碰確認並不提供相同特性。SMS 復原可能遭帳號接管或 SIM 卡交換攻擊;可用時優先選擇備用驗證器或離線復原碼。

中階 · 從需要的功能開始

不必一次採用所有應用程式。先為重要網站帳號使用 FIDO,並註冊備用驗證器。需要簽署、加密或身分驗證功能時再加入 OpenPGP。移動現有鑰匙前,確認演算法支援與備份復原。只有具體需要憑證式身分驗證時才設定 PIV。

驗證不依賴原權杖的復原

拔除日常權杖。確認文件記錄的備份能解密既有測試檔案,並產生有效簽章。確認獨立註冊的驗證器或復原方式能恢復每個重要帳號的存取。記錄步驟,變更鑰匙或帳號憑證後重新測試。

下一篇專文 →回到開頭 ↑