Yubikey : 使用PIV和PKCS#11连接SSH

一. 这是什么?

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 了。

发表评论

邮箱地址不会被公开。 必填项已用*标注