← Home

Canokey 初体验 && 命令行的私密信息传递

5 November, 2022

本文讨论了 Canokey 的配置以及使用。

2202 年双十一,我终于买了 Canokey,然后到手玩了一晚上

Canokey 配置

关于 Canokey 如何配置,已经有比较多的博客讲过这一点了,我在这里仅仅做简略的记录。如果寻求配置教程,可以考虑下文「参考链接」一节的各个教程。

GPG 配置

我之前的 GPG key 只有一个主密钥,配置也比较烂,索性直接 revoke 掉换新的。

首先在 Tails 官方网站下载 Tails 的镜像,并且丢进 Ventoy 然后 boot.

使用 Tails 是因为它是一个专门为隐私保护特化的发行版,默认禁用了 Tor 以外的网络连接,预装 gpg, paperkey, ccid 等用于密钥生成、导出、智能卡写卡等的实用工具,而且每次抹除所有数据。

我用不到网络功能,所以在 Additional Settings 里面把网络连接全部关闭;同时因为我要在一个 luks U 盘分区上保存我的主密钥,我还启用了 root password.

以下流程在 Tails 中完成

首先生成 GPG key

gpg --expert --full-gen-key

类型选 (11) ECC (Set your own capabilities)

启用功能设置为认证 (Certify)

曲线选择 Curve 25519

有效期限设置为 0(key does not expire)

随后

gpg --quick-add-key <fingerprint> cv25519 encr 2y
gpg --quick-add-key <fingerprint> ed25519 sign 2y
gpg --quick-add-key <fingerprint> ed25519 auth 2y

添加三把子密钥,然后将公钥、公钥 revoke 证书、主私钥和三把子私钥分别导出:

gpg -ao pub-key.pub --export <fingerprint>  # 导出公钥
gpg -ao main-key.asc --export-private-key <fingerprint>!  # 导出主私钥,注意加 ! 以保证只导出主密钥而不导出子密钥
gpg -ao encr-key.asc --export-private-key <fingerprint>!  # 导出加密子私钥
gpg -ao sign-key.asc --export-private-key <fingerprint>!  # 导出签名子私钥
gpg -ao auth-key.asc --export-private-key <fingerprint>!  # 导出验证子私钥
# revoke 证书在生成主密钥后会自动生成,在输出的路径下寻找即可

然后 mount 我的 luks U 盘分区:

sudo cryptsetup luksOpen /dev/sdb myusb
mkdir myusb
sudo mount /dev/mapper/myusb myusb

过程中会需要输入 root 密码和分区的加密口令,完成后将主私钥和 revoke 证书一起存放进去,然后 umount 并拔出:

sudo umount myusb
sudo cryptsetup close myusb

然后 mount 我的另一块 U 盘,保存子私钥、revoke 证书和公钥。

随后将密钥导入 Canokey:

gpg --edit-key <fingerprint>

记得每个 key 选择正确的 slot,而且因为要用两个 key,所以第一个 key 操作完成后不要保存,直接 Ctrl-C 退出 gpg,插入第二把 key 导入完再保存,默认的 PIN 和 AdminPIN 分别为 12345612345678,建议修改。这个时候也可以设置持卡人姓名等信息。

完成之后 reboot.

以下流程在正常工作环境中完成

首先从 U 盘中拷贝出公钥,上传到 keyserver 并且导入 gpg:

gpg --import pub-key.pub

然后插入 key,将其中的私钥 fetch 到本地

gpg --edit-card
(一大堆输出)
gpg/card> fetch

理论上此时就可以愉快玩耍了,我们可以简单地测试一下:

echo "茨月❤RaRa" | gpg -r "Chris Zhang" -e | gpg -d 

输入 PIN 之后触摸 Canokey,看到输出与 echo 内容一致即可。

U2F/FIDO 配置

这个配置主要用于部分网站 & OpenSSH key 的生成。

首先安装 libfido2,提供 fido2-token 工具。

fido2-token -L

查看自己 Canokey 的设备,然后

fido2-token -S <device>

设置 PIN. 其实你现在不设置的话在网上添加的时候也会让你设置的

OpenSSH 8.2 及之后支持了 ecdsa-sked25519-sk 这两种支持 FIDO2 的 SSH 密钥生成,插入 Canokey 后输入

ssh-keygen -t ed25519-sk -c "Your Email"

即可,相比一般的 ssh-keygen 流程仅仅多了一步 PIN 输入和 key 触摸。

那命令行的私密信息传递是怎么回事?

之前为了自己在设备间传送配置文件方便,我写了一个在线剪贴板,包括一个 Actix-Web 后端一个 Yew 网页前端一个 clap 命令行前端

目前网页前端部署在了 https://paste.zcy.moe, 后端 API 在 https://api.zcy.moe, 可以试着玩一玩 :)

这样一来,私密信息的传输可以简化为

echo <Your Message> | gpg -ar <Your Recepient> -e | pb send

接收则是

pb get <Token> | gpg -d

实际上这套工具长期没人用,但是只有自己用也是挺方便的

JS
Arrow Up