二、使用CAPI
CAPI要用憑證的方式驗證,憑證可以直接在YubiKey建立,然後導出公鑰,及轉換SSH KEY,私鑰因為存在YubiKey中,所以不會獲取到私鑰,另外一種方式是在電腦中自行建立憑證,然後自己將私鑰寫入到YubiKey中,兩種方式根據自己的需要,本文使用第一種。
實際操作看起來YubiKey查到電腦上後,憑證會自動被導入到作業系統中(RSA的會自動導入,ECC的無法)。
管理工具可以管理PIV的設定
其中PIN部分呢,可以修改PIN和PUK及管理的主要KEY的,這幾項目都有預設的密碼,建議修改,但要記住改成了什麼。
PIN: 123456
PUK: 12345678
Management Key: 010203040506070801020304050607080102030405060708
憑證的部分有幾個槽,比如9a,9c,9e,9e等,起內容為:
Slot Information:
Slot 9a: Authentication
Slot 9b: Management Key
Slot 9c: Digital Signature
Slot 9d: Key Management
Slot 9e: Card Authentication
Slot f9: Attestation
Slots 82-95: Retired Key Management
其中的幾個槽的詳細說明:https://developers.yubico.com/PIV/Introduction/Certificate_slots.html
本文使用的是其中的9a槽
點擊建立憑證
支援的等級有
RSA 1024
RSA 2048
ECCP256
ECCP384
因為我的演示用途,所以管理KEY沒有變更,所以我是使用預設的KEY
事後可以重新生成新的憑證,就會把原有的覆蓋掉,比如我事後就新建了一個到2200年到期的新憑證。
如果需要導出憑證,可以點擊「Export」導出,但因為後續系統會自動從YubiKey中讀取,所以此處導出不是必須。
使用ykman導出公鑰
ykman piv keys export 9a public.pem
將公鑰轉換為ssh的驗證key,這個建議在linux當中執行,在windows中執行可能會提示權限太過寬鬆的提示而不進行轉換,解決方式是針對檔案的權限設定,相對繁瑣些。
ssh-keygen -i -m PKCS8 -f public.pem
將轉換好的KEY,添加到~/.ssh/authorized_keys的結尾,因為原本就有FIDO和建立azure vm時的SSH KEY,要切記前面的不要修改,只是附加到結尾並保存退出。
Linux被連線端這樣就設定完成了,而客戶端仍然選擇putty-cac,在Connection—SSH—Certificate點擊「Set CAPI Cert..」,然後選擇先前匯入到系統的憑證。
連線到Linux時就會提示輸入PIN,此時要輸入YubiKey的PIN,如果沒有修改就是123456,如果已經被修改過,就輸入修改過的PIN
可以看到已經成功登入系統。
上述的操作都是使用Putty CAC,其他的軟體會比較受限,但也是可以通過其他工具輔助,比如使用https://github.com/buptczq/WinCryptSSHAgent來做一個本地的代理。
程式執行後會在系統托盤位置,右鍵Show Public Keys查看是否有讀取到YubiKey中的憑證,如果沒有,可以嘗試把YubiKey拔掉重新插入。按照作者的說明是不需要導入憑證到作業系統當中,我自己測試確實可以直接讀取到YubiKey中的憑證,如果實在無法讀取到,也可以嘗試按照前面的步驟匯入到作業系統當中。
以Xshell為例,要設定的位置是兩個地方,使用者名稱輸入Linux的登入帳號,方法選擇Public Key,但不指定任何一個現有的Key
SSH中,勾選「使用Xagent進行身份驗證」
在沒有插入YubiKey時,連線會提示要選擇智慧卡
插入Yubikey後,會有下面的提示,點擊確定後,會提示輸入PIV的PIN碼,驗證通過後就會登入到系統當中。
後續登入只要有插著Yubikey,就不需要再驗證PIN碼,會自動登入。
如果連線的時候提示too many authentication failures的錯誤,則可能是系統中SSH KEY太多了。
解決方式可以將/etc/ssh/sshd_config中的MaxAuthTries解除註釋,把預設的數字比如6,修改為大一點的數字,比如30。
保存退出後執行service sshd restart讓設定生效。