yubikey note

2022-12-29

最近買了 yubikey,第一次碰到這個東西,特別來記錄一下

下面主要是紀錄將 Yubikey 作為 smart card 使用的筆記

首先如果像我一樣把 gpg 的處裡放在 vmware 裡面的話記得在 vmx 加這兩行才讀的到 yubikey

1
2
usb.generic.allowHID = "TRUE"
usb.generic.allowLastHID = "TRUE"

要長得像下圖才是連線成功,下面的這個名稱是改完 vmx 之後才會出現

如果前面有加上 Shared 的字串是無法讀到的,如果沒有改 vmx 只會出現紅框的選項

之後就可以開始著手下載必要的套件 (建議照順序)

1
2
3
sudo apt install scdaemon
sudo apt install gnupg
sudo apt install yubikey-manager or pip install --user yubikey-manager

下面針對常用的功能記錄下指令

  • 確認 yubikey 的連線狀態
    1
    ykman list
  • 確認 yubikey 狀態 (同時會讀取 yubikey 內的金鑰)
    1
    gpg --card-status
  • 設定 yubikey 的狀態 (如果要使用進階功能需要在進入 gpg shell 之後,下 admin 指令解鎖)
    1
    gpg --edit-card
    想要更改 PIN 碼的話可以下 passwd 進行更改
  • 產生 gpg key,下面的指令能選擇所有的加密演算法
    1
    gpg --full-generate-key --expert

    這邊是聽同事的建議選擇 ECC and ECC25519,但如果要通用性(支援性)來說還是 RSA 比較好
    接著輸入能識別這把 key 的資訊


    產完之後他就會自動匯入 gpg 的庫裡面了
  • 列出已匯入的 gpg public key

    1
    2
    3
    gpg -k
    or
    gpg --list-keys --keyid-format=long
  • 列出已匯入的 gpg private key

    1
    2
    3
    gpg -K
    or
    gpg --list-secret-keys --keyid-format=long
  • 將 private key 匯出成檔案

    1
    gpg --export-secret-keys > secret.key
  • 將 private (public) key 匯入 gpg 庫內
    1
    gpg --import [key]
  • 將 private key 寫入 yubikey 內

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    gpg --edit-key [GPG key ID]
    gpg> toggle
    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? 1
    gpg> key 1
    gpg> keytocard
    Please select where to store the key:
    (2) Encryption key
    Your selection? 2
    gpg> key 0
    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

    退出後記得選不要 save,不然下次把同一把 key 匯入另一個 yubikey 當成備用的時候會出現以下錯誤

    如果出現這個錯誤的時候只要把 gpg 的私鑰庫清掉就可以繼續用了
    rm -r ~/.gnupg/private-keys-v1.d/*

  • 有時候 gpg-agent 異常的時候也需要 kill agent 重新啟動

    1
    gpgconf --kill gpg-agent
  • 針對檔案進行加密
    1
    gpg --encrypt -o output.pgp -r [e-mail] ./source.txt
  • 針對檔案進行解密
    1
    gpg  -o source.txt --decrypt output.pgp

如果沒插進 yubikey 進行解密會這樣

如果是像我一樣使用備援的 yubikey 進行解密的話,因為現在的 gpg 庫所綁的 private key 是綁主要 yubikey 的序號,所以一樣可以清掉 gpg 庫再重新 get card-status 就可以用備援的 key 解密了
rm -r ~/.gnupg/private-keys-v1.d/*

ref:
https://developers.yubico.com/PGP/YubiKey_5.2.3_Enhancements_to_OpenPGP_3.4.html