skip to content
logo柚子の札記

整了个密码学工具:CanoKey NFC-A

/ 7 min read

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 贵的人这是个好东西。

Reference

https://docs.canokeys.org/userguide/

https://console.canokeys.org/

https://undeadly.org/cgi?action=article;sid=20191115064850