CanoKey是一个开源 USB / NFC 安全令牌,Tuna 协会出品
提供以下功能:
FIDO2 / WebAuthn OpenPGP Smart Card V3.4 PIV TOTP / HOTP NDEF
目前发售的是 CanoKey(固件核心功能实现开源,密码学运算不开源) 拥有 Yubikey 5 NFC 大部分功能,作为早起的鸟儿只需要 79+10,价格不到 Yubikey 的四分一。 就来说下几个我几个比较常用的方式。
U2F
2FA 的一种方式,即是 Google ,GitHub 等网站的安全密钥(Security Keys),相对于SMS ,TOTP等方式更为安全,攻击者可以通过钓鱼 ,社工等方式获取临时验证码,而实体Key较难被接触到。设置后可以输入密码轻触 key 完成二次认证登陆。 但是为了避免 Key 丢失损坏,你可能需要创建 TOTP 或者备用码作为备用的登陆方式,又或者多买一把作为备用,大部分网站都支持设置多个 Key 。 PC 主流浏览器基本都支持,Android 可能只有使用 Chrome 了。 支持的网站 https://www.dongleauth.info/
U2F + SSH
OpenSSH 8.2 版本开始支持 FIDO / U2F 安全密钥。 个人使用的 ArchLinux 已经是最新版本,Debian Stable 之类稳定版系统可能需要寻求 backports 的支持,当然了客户端和服务器端都需要新版本。
安装新版 OpenSSH 后可以使用 ssh-keygen -t ecdsa-sk 生成密钥。至于 ed25519-sk 只知道 5.2.3 以上固件的 Yubikey 是支持的,CanoKey 据说短时间内不会支持,而且现有的硬件也不可以升级。
# 生成密钥对
$ ssh-keygen -t ecdsa-sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter file in which to save the key (/home/yuz/.ssh/id_ecdsa_sk):
# 为了方便我个人没有使用密码
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_ecdsa_sk
Your public key has been saved in id_ecdsa_sk.pub
您将照常获得密钥对,但在这种情况下,私钥文件不包含高度敏感的私钥,但而是持有安全密钥用来派生的“密钥句柄”签名时的真实私钥。 因此,窃取私钥文件的副本时也不会窃取您的安全密钥(或对其进行访问)不会给攻击者任何东西。 然后将 id_ecdsa_sk.pub 的内容写入服务器端 ~/ssh/authorized_keys 创建 ~/.ssh/config 写入
Host host
IdentityFile ~/.ssh/id_ecdsa_sk
插入 Key ,ssh 登陆服务器,输入密码后轻触 Key 登入。 比较遗憾,GitHub 暂时还不支持。 现在支持了~
OpenPGP Smart Card
OpenPGP 智能卡的作用就是将私钥存到 Key 里,私钥写入后将不可被导出,从而减少泄露的机会。 Canokey 支持的算法一览 https://docs.canokeys.org/userguide/openpgp/#supported-algorithm
创建密钥感觉不用写了,要注意不支持 RSA3072 ,而且要备份好原密钥,转移到智能卡后就没了。
智能卡有 PIN 和 Admin PIN 要区分
默认 PIN: 123456 AdminPIN: 12345678
$ gpg --edit-key 13AFCE85
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec 2048R/13AFCE85
created: 2014-03-07 expires: never usage: SC
trust: ultimate validity: ultimate
ssb 2048R/B4000C55
created: 2014-03-07 expires: never usage: E
[ultimate] (1). Foo Bar <foo@example.com>
# 这时候已经默认选中主密钥 primary key ,或者输入 key 选中主密钥
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
# 输入密钥密码,接着输入admin pin
sec 2048R/13AFCE85
created: 2014-03-07 expires: never usage: SC
trust: ultimate validity: ultimate
ssb 2048R/B4000C55
created: 2014-03-07 expires: never usage: E
[ultimate] (1). Foo Bar <foo@example.com>
gpg> key 1
# 切换到第一个子密钥
sec 2048R/13AFCE85
created: 2014-03-07 expires: never usage: SC
trust: ultimate validity: ultimate
ssb* 2048R/B4000C55
created: 2014-03-07 expires: never usage: E
[ultimate] (1). Foo Bar <foo@example.com>
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
# 输入密钥密码,接着输入admin pin
sec 2048R/13AFCE85
created: 2014-03-07 expires: never usage: SC
trust: ultimate validity: ultimate
ssb* 2048R/B4000C55
created: 2014-03-07 expires: never usage: E
[ultimate] (1). Foo Bar <foo@example.com>
# 保存
gpg> save
这样私钥就转移到 CanoKey 上了。
在其他新设备上使用,只需将公钥下载到新的设备,插入key,然后输入命令 gpg —card-status ,OpenKeychain 可以触碰 NFC 或插入手机验证,之后就可以使用了。
CanoKey 默认每次签名都需要输入 PIN,感觉麻烦,开启触摸签名后其实不是很必要了。
$ gpg --card-edit
$ gpg/card> admin
$ gpg/card> forcesig
$ gpg/card> quit
然后打开 https://console.canokeys.org/ 连接 CanoKey 设置,之前操作过智能卡可能会遇到设备在忙的情况,重新插拔就好。
选择 Admin ,输入PIN,进入设置页面,将 OpenPGP SIG touch policy 开启,这样每次使用只需要输入一次 PIN 了,之后签名都需要触摸一次。
Conclusion
好像也没什么可说了,自己平时用的功能也就这些。对比 Yubikey,平时用的功能大多都覆盖到,除了 Challenge-Response(可配合 Keepass 使用)。PCB板+滴胶相比 Yubikey 显得很廉价,结实还是很结实的。early bird 计划非常值,不知道之后会卖多少钱,但是应该会比 Yubikey 便宜,对于想要更好的安全性,又嫌 Yubikey 贵的人这是个好东西。