Skip to content

YubiKey 使用

Updated: at 01:12

Table of contents

Open Table of contents

YubiKey 功能简介

YubiKey 目前支持 WebAuthn、FIDO2 CTAP1、FIDO2 CTAP2、Universal 2nd Factor (U2F)、Smart card (PIV-compatible)、Yubico OTP、OATH – HOTP (Event)、OATH – TOTP (Time)、Open PGP、Secure Static Password 等多种功能。其中 FIDO2、2FA 和 U2F 是用于身份验证的功能,OpenPGP 和 PIV 是用于加密和签名的功能,OTP 是用于一次性密码的功能。

Yubico 官方还在官方的 下载中心 提供了 YubiKey Manager 用于管理 YubiKey,YubiKey Authenticator 用于管理 OTP。目前 如果想玩硬件密钥的话,YubiKey 是一个不错的选择,开源的方案可以选择 Canokey

我目前使用 YubiKey 已经一年有余,主要用于 服务器登录、commit 签名 等等,并没有使用 PIV ,PIV 可以用于 Windows 无密码登录。下面我将介绍如何使用 YubiKey 进行这些操作。

YubiKey 还支持触摸,可以使用 Yubikey Manager 来管理,请按,长按 等操作。

将 YubiKey 用于服务器登录(SSH)

方法1 (OpenPGP)

先来了解一下 PGP,PGP 支持很多功能,其中包括签名、加密、认证等。下面是一些常见的缩写:

缩写全称作用
[C]Certificating认证其他密钥,比如签署一个子密钥。
[S]Signing签名。证明某数据没有被篡改。例如文件签名,git commit 签名。
[A]Authenticating认证。比如 SSH 登录。
[E]Encrypting加密。

创建一个 PGP 密钥对

  1. 将 YubiKey 插入电脑
  2. 打开终端,输入 gpg --card-edit admin 进入 YubiKey 的管理界面,YubiKey 默认的 PIN 是 123456, 管理员的 PIN 是 12345678。 可以使用 passwd 命令来修改默认的 PIN 码
  3. 创建 PGP 密钥对:
gpg --gen-key
# 创建主密钥
# 选择 `RSA and RSA`,选择 `4096` 位,选择 `0` 为过期时间,输入你的姓名和邮箱,输入密码,完成密钥对的创建。

# 创建子密钥
gpg --edit-key 0xABC # 进入密钥编辑界面
addkey # 添加子密钥
# 再来一遍上面的流程,注意选择 `S` 或者 `A` 作为用途,最终得到一个主密钥下有三个不同功能的子密钥。
  1. 将PGP密钥导入到 YubiKey
# 设置名称
gpg --edit-key 0xXXXXXXXXXXXXXXXXXXXXXX # 进入密钥编辑界面
key 1 # 选择要操作的密钥
keytocard 1 key 1 # 将签名密钥导出到 YubiKey
key 2 # 选择要操作的密钥
keytocard 2 key 2 # 将加密密钥导出到 YubiKey
key 3 # 选择要操作的密钥
keytocard 3 key 3 # 将认证密钥导出到 YubiKey
quit # 退出编辑界面
  1. 这样,我们就把 PGP 密钥导入到了 YubiKey 中,可以使用相同的方法把密钥导入到其他 YubiKey 中。比如你的备份 YubiKey。

使用 YubiKey 进行 SSH 登录

  1. 首先,我们使用 ssh-add -L 将 YubiKey 的公钥导入到服务器的 ~/.ssh/authorized_keys 文件中。
  2. 然后配置 gpg-agent。在 Terminal 中输入 brew install pinentry-mac 安装 pinentry-mac,然后在 ~/.gnupg/gpg-agent.conf 中添加
pinentry-program /opt/homebrew/bin/pinentry-mac
enable-ssh-support
use-standard-socket
default-cache-ttl 600
max-cache-ttl 7200
  1. 设置环境变量(或者添加到 .zshrc 或者 .bashrc 中)
export GPG_TTY="$(tty)"
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
  1. 重启 gpg-agent
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent

这样在使用 SSH 登录的时候,会弹出一个窗口,提示你输入 YubiKey 的 PIN 码,输入正确的 PIN 码后,就可以登录了。每次电脑解锁后都需要重新输入一次 PIN 码,之后每次触摸 YubiKey 上的金属触点就可以了。

方法2 (FIDO2)

这里其实还是分两种方法,

  1. 密钥对存储在 YubiKey 中

  2. 密钥对存储在电脑中 这里我只介绍第一种方法,这样我们每次带上 YubiKey,随时随地都可以登录服务器了。第二种方法可以参考 这篇文章

  3. 插入 YubiKey 输入 ssh-keygen -t ed25519-sk -O resident -O application=ssh:YourTextHere -O verify-required

  4. 按照命令行的提示完成密钥创建

  5. ssh-add -L 获取的ssh公钥导入到服务器的 ~/.ssh/authorized_keys 文件中

  6. 修改客户端的 ~/.ssh/config 文件,添加

Host myHost
    HostName host.example.com
    User root
    Port 22
    IdentityFile /Users/realtong/.ssh/RealTong-Yubikey-5C

将 YubiKey 用于 commit 签名

  1. gpg --list-secret-keys --keyid-format LONG 获取 GPG key ID
  2. git config --global user.signingkey XXXXXXXXXXX 设置每次 commit 使用的 GPG key ID
  3. 在 Github > Settings > SSH and GPG keys > New GPG key 中添加 GPG key
  4. git commit 每次 commit 都会弹出一个窗口,提示你输入 YubiKey 的 PIN 码,输入正确的 PIN 码后,就可以提交了。经过签名的 commit 显示一个小绿锁。

小 Tips

参考