一. 这是什么?
Q: 完成后效果是什么样子的?
A: 在客户端上插上 Yubikey,然后输入 PIN 就可以登录 SSH。若拔掉 Yubikey,还能通过原来的方式登录 SSH(当然你也可以直接禁用原来的方式啦
Q: 我需要准备什么?
A: YubiKey NEO 或 YubiKey 4 以及之后的型号, 客户端若干,服务器(被SSH连接的)若干,脑子。
Q: 这些东西是如何工作的?
A: Yubikey 作为 PKCS#11 智能卡,通过 PIN 验证后释放存储于其上的私钥,然后用私钥与服务器上的公钥验证,验证通过后即可建立 SSH 连接。
Q: 为什么需要 PIV 而不是普通的公私钥对?
A:
1) 更方便——在 SSH 连接的时候不需要找私钥文件
2) 更安全——不用担心私钥泄漏导致的信息安全问题(私钥存在Yubikey上)
二. 好酷!那要怎么做才能拥有它呢?
下面以客户端 macOS Catalina, 服务端 Ubuntu 18.04 LTS 为例。
以下所有命令均在客户端操作。
1. 在客户端上安装 PKCS#11 的读卡器软件:opensc
(macOS 里是自带的,如果你用 Linux 的话用包管理器安装一下名叫opensc
的软件包。)
2. 安装 Yubikey 管理工具 Yubico-piv-tool
brew install yubico-piv-tool
3. 检查你的 Yubikey 现在的PIN
$PIN = 123456 #若当前 PIN 为 123456
yubico-pin-tool -a verify-pin -P $PIN
注意:Yubikey 默认的 PIN 是 123456,默认 PUK 是 12345678.
4. 更改 Yubikey 的 PIN
为了优化复制粘贴体验,先加环境变量(下同)
$OLD_PIN = 123456 # 假设你的旧 PIN 是 123456
$NEW_PIN = 654321 # 假设要把 PIN 改为 654321
yubico-piv-tool \ –action change-pin \ –pin $OLD_PIN \ –new-pin $NEW_PIN
5. 创建 RSA 公用证书
yubico-piv-tool \
--slot 9a \
--action generate \
-o public.pem
会要求你输入 Yubikey 的 PIN,然后你可以获得 public.pem
这个公钥。
6. 创建一个自签名的 RSA 证书(私钥)
PIN=123456 ## 你的 Yubikey 现在的 PIN
CERT_COMMON_NAME="Your SSH Key" ## 给密钥起个好听的名字
PUBLIC_KEY_FILE="public.pem" ## 刚刚生成的公钥路径
OUTPUT_FILENAME="private.pem" ## 要生成的私钥路径
VAILD_DAYS=365 ## 证书有效期,以天为单位
yubico-piv-tool \
--action verify-pin -P $PIN \
--action selfsign-certificate \
--slot 9a \
--subject "/CN=$CERT_COMMON_NAME/" \
--valid-days=$VAILD_DAYS \
--input $PUBLIC_KEY_FILE \
--output $OUTPUT_FILENAME
7. 把证书导入 Yubikey
yubico-piv-tool \
--action import-certificate \
--slot 9a \
--input $OUTPUT_FILENAME
8. 生成 SSH 公钥
ssh-keygen -D usr/local/opt/opensc/lib/pkcs11/opensc-pkcs11.so -e > ssh-public-key.pub
9. 把这个公钥导入你的服务器
ssh-copy-id -f -i ssh-public-key.pub [email protected]
10. 把 PKCS#11 读卡器加入 SSH 配置文件
sudo echo "PKCS11Provider /usr/local/opt/opensc/lib/pkcs11/opensc-pkcs11.so" | sudo tee -a ~/.ssh/config
到这里所有配置都结束了。
现在插上 Yubikey,用 SSH 连接你的服务器,应该会显示:
Enter PIN for 'Your SSH Key':
输入你的 Yubikey PIN 就可以登录 SSH 了。