开箱 | 国产开源硬件安全密钥 Canokey Pigeon

前言

之前没赶上 cf 优惠券的活动,然后又一直心水 Yubikey,奈何国内的价格太贵,闲鱼的价格也一直不降反涨,无意间发现了国产开源硬件 Canokey 的存在,似乎可以平替 Yubikey,在清华开源站中也可以查到相关的资料:金枪鱼之夜:从 YutriKey 到 CanoKey

简单开箱

目前提供两种商业产品和两种开发产品,均使用的相同内核:canokey-core

我这款是 Canokey Pigeon,经典鸽子

开箱开箱:

包装

样子大概长这样:

反面

正面

插入亮灯

介绍

Canokey 支持的协议很多,类似与 Yubikey 5 NFC,支持的协议如下:

  • FIDO2 / U2F
  • OpenPGP
  • PIV
  • NDEF
  • OATH(TOTP、HTOP)

对于平替 Yubikey 的需求,协议方面是足够了,但是由于硬件方面的问题,NFC 的实现效果可能不尽人意,具体可以参照以下两个 discussion:

官方文档中也有各个协议的详细说明,同时由于协议互通,Yubikey 的一些配置文档也通用()

相关名词解释

下面用容易理解的话对相关名词进行解释,目的是为了让读者有一个大致的了解,具体实现原理或详细信息等可以自行查找相关资料了解

非对称加密、对称加密

简单理解就是非对称加密是通过算法生成一对密钥对,分为公钥和私钥,公钥用来加密,私钥用来解密,对称加密则是一个钥匙既可以加密也可以解密

当然理论上公钥和私钥是可以互换的,但是由于算法会偏向于一方,使得双方长度不相同,一般来说私钥长度较长,长度不同使得破解公钥的难度小于破解私钥的难度,基于这方面原因公钥和私钥是不可以互换的

2FA / MFA

2FA:Two-Factor authentication,双因素认证

MFA:Muti-Factor authentication,多因素认证

为了让用户登录网站时不单单将安全托付于单一的密码上,开发者选择了使用额外因素的方式来保护用户账号安全,防止因为密码泄露而整个账户遭到泄露

OATH、OTP

OATH:Open Authentication,开放认证

OTP:One-Time Password,一次性密码

OTP 是开发者使用两步验证最常用的手段,顾名思义一次性密码只能使用一次,OTP 分为以下两类:

  • TOTP:Time-based One-Time Password,基于时间戳的一次性密码
  • HOTP:HMAC-based One-Time Password,基于 HMAC 算法加密的一次性密码

大致原理是客户端和服务器端均有一个共同密钥,客户端将共同密钥与时间因子经过特定的算法生成代码发送给服务器,服务器端也使用共同密钥与当前的时间因子通过相同的算法生成代码,将两个代码进行比对,如果相同则认证成功,当然如果你把密钥给别人,别人也是能和你算出同样的结果的(

FIDO、FIDO2

FIDO 联盟制定了 FIDO 标准,为了统一由各家 2FA 带来的差异而设立的,毕竟谁也不想换一个 2FA 验证登录就需要多装一个驱动之类的麻烦事,于是 FIDO 标准为了改良传统的 2FA 的体验出现了

FIDO2 是新一代的 FIDO 标准

U2F、UAF

U2F 标准可以认为是 FIDO 标准之一,它是制作类似于 Yubikey / Canokey 之类硬件的标准,可以是 USB 形态的,也可以是 NFC 形态,简单来说是物理形态,免去了用户需要安装第三方驱动或者输入 OTP 代码进行认证的麻烦

既然有物理形态,那么就有非物理形态,UAF 则是通过指纹、语音、虹膜等进行认证的方案

WebAuthn

WebAuthn 标准是 FIDO2 标准的一部分,FIDO2 相比于 U2F 增加了单因素认证的功能,这便是 WebAuthn 标准,这意味着可以实现真正的免密登录,只需要插入物理设备或者通过生物特征进行认证即可

PGP、OpenPGP、GnuPG

PGP 全称是 Pretty Good Privacy,是一个被设计用来加密信息,保护隐私的软件

OpenPGP 是一个标准,现在提到的 PGP 基本上是指 OpenPGP

OpenPGP 是在 PGP 基础上定义的开放标准,GnuPG 则是对 OpenPGP 标准的完备实现

OpenPGP 支持多种算法,其中非对称加密的 RSA 和 ECC 用的比较多,RSA 兼容性好,ECC 体积小、速度快、具有更好的安全性

具体实现原理可以自行搜索,这里不再赘述,对于安全性,经过这么多年的检验,对于个人信息保护还是有保证的

OpenPGP 可以用来给消息、邮件之类的加解密,git commit 认证,ssh 免验证登录等

PIV

PIV 即个人身份验证,是美国政府标准,使用智能卡存储用于签名 / 加密的密钥,主要用于非 Web 场景,可以用来进行验证、签名、加密、认证等

NDEF

NDEF:NFC Data Exchange Format,即 NFC 数据交换格式

Canokey 使用

Web Console

新版本的 Web Console 支持的功能已经变得很多了,大部分功能直接可以使用

Web Console 必须使用支持 WebUSB 的浏览器,例如 chromium 系浏览器,Firefox 不支持

插入 Canokey 访问 https://console.canokeys.org 即可,点击右上角的刷新按钮对 Canokey 进行读取

先进入设置界面,输入自定义 PIN:

输入自定义 PIN

侧边栏设置

相关设置如下,可以查看 Canokey 的相关信息,以及对相关操作做一些简单设置和重置

设置

设置

注意:上述修改的 PIN 仅仅为 Admin panel 的 PIN,与下方所有的 PIN 没有任何关系

OTP

先来介绍如何在 Canokey 中使用 OTP,由于现在绝大多数平台支持的是 TOTP,本文仅介绍 TOTP

类似于 Google Authenticator,Aegis 等两步验证软件,Canokey 可以直接在 Web Console 中进行添加,并且可以单独为每个 TOTP 设置触摸策略(最多可以保存 100 个):

OTP 设置

当然使用 ykman 4.0 进行配置也是 ok 的,具体操作参考官方文档

对于 5.x 版本的 Yubico Authenticator,可以使用 custom reader 直接进行配置:

custom reader

image-20230410123748758

历史版本可以在这里下载:https://developers.yubico.com/yubioath-flutter/Releases/

Android 只有 6.x 的版本,虽然移除了 custom reader 的选项,不能通过 type-c 接口进行识别,但通过 NFC 还是能够进行绑定的,开始识别率感人,但是掌握了识别的位置还是能很快识别成功的(手机上禁止截屏,这里就不放图了)

官方表示以后也有开发专属 app 的计划,敬请期待吧

FIDO2 / U2F

WebAuthn 测试网站:https://webauthn.io/

测试

测试

测试

使用方法很简单,插入 Canokey 在支持的网站上打开两步验证后选择硬件密钥即可,支持的网站例如:Microsoft、Google、Facebook 等,密钥将会自动注册并要求输入 PIN,下次输入 PIN 就可作为二步验证登录了

目前 Microsoft 账户支持使用硬件密钥实现单因素登录,即无需密码直接登录,可以进入账户的其他安全选项部分进行添加

支持网站列表:https://2fa.directory/int/

OpenPGP

除了上述的 TOP 和 FIDO2,这部分算是最主要的应用场景,和 Yubikey 一样,Canokey 同样提供三个子密钥插槽,分别用作签名、认证和解密,对于密钥生成的操作也类似,大致就是一份主密钥,三份子密钥,主密钥只保留验证功能,其他功能使用子密钥

以下操作均在 Win 下进行,使用的工具为 Gpg4Win

相关指令

# # g # # g # g # g g g # # # g # g g g g # g g g g g # g g # g g g g g p p p p p p p p p p p p p p p p p p p p p p p c t g u a g g g g g g g e a k g i g g g g s g g g g g e g g m g g g g g a r s n e e d d e m i n i c - c c c r y e d n t i d y p g c s o c o o o d - / - e - - - - t t - o - - - - n - - - - r - - c n o n n n b c t o e r e k l l l u o e r i a a d a s a c v y a d f n f f f r e a h r d a x e i i i k i c d t m r r e a r i r l e p r e n e l r i i t p y s s s e d a i / p m m l n m g m e r t m c e l o d s g t e e t t t y / r t e o o o e d o n o a i o r - c - - - a w - e - r i - - - s d - x r r r t r - r r f a r y k t l l l t s f n c k t n k k s u k p t e v k - y n p i - i i i e t t o e a e f e e i b o e o - e e s d t l a s s s d o a r r r y o y y g k r y r f k r - y - i f - l g t t t t a d - s s s s e t i o o e i s d g i d e f e - - - m u e t f y a < l u u y f i e n l e n i g n d d d a s d i u [ d k k e t t s y g - t e c c l p t i i i k i n l - - k i d e e p p n a a f . r r e g r r r e t g l w w e n c y y u u < s c i a y y - r s s s t - i i y a i t t k f k h l s p p a e s i k g t t i t r d e i - - e c t t g l a a a u n e e h h d h d f f y l c s e o g g g r g y n - - e k o i i i e e i n a e e e e s e f k o e r l l d r g - t d n n n c r i e r i y e e t n r a t t t g a a n y n u o - e g - - - p r t g g u t s r l f c e s e s g d e e r s e e - - e i i n o x s - r i e r r e e u v l p t c t h w i k p p r a x x s e e i k r - o n e r c i p p e l e / e a s r f y i [ i t d o o r n b t - o k o n k d i > r r < t y s c s t e ] v t t i k e o k a y e - d e < c e w n i < s > y k k t i d - d s k e e e t w h e c i y t h c i o e y r d i o t r l i e > d c n h l d t a f - u - o n i s s o k r o g u e r e k b r y u e k u s s y e i s e y d e < r - ] r k f e i i i y d n d i > g > d e r o p r r i u n s t e r [ k i e d y > i d o r u s e r i d ]

生成主密钥

g g T T P Y P C Y P C Y P Y P K K I G R E C Y C W s d g # g g p p u p p h h l o o u o o u o l o l e e s n e m o o h e o i e p p u u i g g i e e ( ( ( ( u s r u s r u e u e y y u a a m u a m s n W g g b b d s r a ( ( ( ( ( ( ( 1 1 1 1 r s r ( ( ( r s r ( ( ( r a ( ( ( ( ( ( ( ( ( r a t P l i m n n e k e i : : l ( e s 1 2 3 4 7 8 9 0 1 3 4 i e S A Q i e S A Q s 1 2 3 4 5 6 7 8 9 s i d h G l e s " g e s r n i - G i e ) ) ) ) ) ) ) ) ) ) ) s b n ) ) ) s b n ) ) ) s e ) ) ) ) ) ) ) ) ) s e s o i n n e X e e o ) a d d r c e n s i e l t e l t e e < < < < e s n a a t l X d t t o i e e X x u s s R D D R D R E E E E E l e T T F l e T T F l s C C N N N B B B s l s n n n n v s e m d : e X ( h d o w r v a d X p P f e S S S S S S C C C x x e a o o i e a o o i e e u u I I I r r r e e p > > > > a c e e d c X N t e u r s e o n 2 X e G r N l A A A A A A C C C i i c a l g g n c a l g g n c l r r S S S a a a c c e 0 w m y l n o d : r # t X ) o r r c c d 5 X r ) e O e s s t c l g g i t c l g g i t e v v T T T i i i p t c i o r s e e X a i a t a 5 X t e c a a ( ( ( ( ( ( ( t t i t o l l s i t o l l s i c e e n n n 2 i i = = = = = d t r X s d m g a n o t s 1 X 2 W t n n s s s s s s s i i o i w e e h o i w e e h o t P P P p p p 5 o f e t X s < e e c g b r i e 9 X . s A d d i i e e i i e n n n o e e n o e e n 2 4 - - - o o o 6 n y k k k k k f e c o X : t X , n t e y o c X - 4 o R w g g t t g g t g g ? n d t t d ? n d t t d ? w 5 4 2 3 5 o o o k ? e e e e e o x t X h X e i t t n r 2 X f . f R h R E n n n n s h h s h h h 5 8 5 8 2 l l l 1 h y y y y y r p ? c X X i X ( r o h t ' e 0 X u 0 t A a S l y y y k k 1 a e e s a e e q i 1 6 4 1 1 o ? i o X X s X C a n e e C c t 2 X l ; w N t A g o o o o a o o e e 1 f c f c c 9 P P P w d e e e e r ( n X X ) t r : e 3 X l a T a n n u u n n u y y o t s a # o t s a # h - - - # o x x x x ( e y s X U X o e ( p \ r k - X - C r Y k m l l r r d l r # r i i u r i i u * 2 3 5 l e p p p p 0 / t X S @ m t r c \ t e 0 X g o e , i a y y y f o g t o g t 退 e d 5 8 1 2 o s i i i i ) a N r X E X m a y i h U i y 4 X e p : n l ) ) o o e ) o r t n n h t n n h l e 6 4 2 5 n r r r r t ) u @ R X e p m a s f - X n y t d w w n w o h s e h s e l f 5 g n e e e e 0 c X - X n l e e n e i c 1 X - r y o n n c n m 使 i : c n S i : c n i a 1 o s s s s a y t X I . t o c r c r 0 X k i o o r s a t i s a t p u 9 t t # l X D c , t o g e s a e X e g u t f c c y c c S p i g C p i t l h i i i i l # a . : o n e \ t a [ X X y h h a a p a a E E i a c n E e a c i t e e n n n n c m ( o n t \ e t C X X t a e k p p t p r C C g b a C r b a c * x u o > E f t e o l e ] X X # r e a a ) a d C C n i t C t i t 线 k p n n n n s m " ) h r s s d X X ( e e y b b b l e i l e c e i e m r e a g i t X X C x i i * i k C i k f i u y r d w m y r a a t a l o a X X ) f t y l l d l e e t c e y t c r e a e o e i n k i i e r n X r e o i i e i y r y a y y a v s y e n a I l d e o n n e d X < 2 e n u t t f t : t p : p e h s k t r D o y n c d X X 0 e t i i a i i a a o s h s o m b ; e e s X X 2 w e e u e S f b S b y u s t r o n j a i X X 1 t p a s s l s i y i i i o 线 l o b a t o \ s g X X o e n ) ) t ) g l g l u d ( y r h u n X X g r t * n # i n i i O t d i g A ' e X X 1 c m : t t w b d ) e , s h p C d X @ 0 h i C y C y a e e k s p : . X X a t e e n n a . m g e D \ X X C n t r r t v t y o i n a \ X X o g e t t : a i / I v v t t U X . d e d i i l f ( t e e r a s X c e f f # i y Q s o \ e X o a b y y d ) i t p \ r m G n y . y u s h t y R s # > m d A S A o i e h . \ b l u i u # u t a e a # H r a t g t r ? m m l e w h n h g o r i s u d . e e k o u a n i i i n n e o s n g l d s t t y # d e d \ e t i C i . , o \ n r c e c i m g c i a r a # d u n e b t t t e t n u j u e i e 线 a i u p \ t f l m g \ e y t i b \ A o z e \ p i e r o p t p p D . e t e a r h n t f e p a o g \ r p \ m - R r o e a C v m e o i r c n t s g i . \ f d y ' g n c u r p e g a \ t \ e o d p e n 使 p g p - r e v o c s . d \ \ D 6 B 3 4 0 E 4 E 2 A F 3 6 A 9 A 5 9 7 8 3 6 0 A 1 2 1 2 3 7 1 6 A 6 F 3 4 4 4 . r e v ' #

生成子密钥

g C s u # # g g g g C s u s s s # p : e i p p p p : e i s s s g \ c d g g g g \ c d b b b U U s s - e - - - - e f r e K q q q f r e K c e e i s d e u u u i s d e v d d n \ 2 y i i i n \ 2 y 2 2 2 g l 5 c c c g l 5 5 5 5 e s 5 f k k k e s 5 f 5 5 5 r i 1 i - - - r i 1 i 1 1 1 p l 9 n a a a p l 9 n 9 9 9 r e / g < d d d r e / g / / / i n A e f d d d i n A e B 9 F n c 1 r i - - - n c 1 r 3 6 9 t e 2 p n k k k t e 2 p 9 D B j 1 r g e e e j 1 r 7 2 B \ 2 i e y y y \ 2 i D 1 C - A 3 n r - A 3 n E F 3 k p 7 t [ p < < < k p 7 t [ 7 1 8 e p 1 u r f f f e p 1 u 4 4 6 y D 6 = l i i i i y D 6 = l A 6 9 i a A t n n n n i a A t D 8 5 d t 6 X i t g g g d t 6 X i B 4 C - a F X m > e e e - a F X m 1 4 D f \ 3 X a r r r f \ 3 X a 4 D 8 o R 4 X t p p p o R 4 X t 6 E E r o 4 e r r r r o 4 e 1 4 3 m a 4 X ] i i i m a 4 X ] B 2 6 a m X n n n a m X t i 2 X X t t t t i 2 X X 2 2 2 n 0 X X > > > n 0 X X 0 0 0 l g 2 X l g 2 X 2 2 2 o \ 3 X X c e e o \ 3 X X 3 3 3 n g - X X v d d n g - X X - - - g n 0 X X 2 2 2 2 g n 0 X X 0 0 0 u 4 X y 5 5 5 u 4 X 4 4 4 - p - < 5 5 5 - p - < - - - K g 1 X X 1 1 1 K g 1 X X 1 1 1 s \ 0 X X 9 9 9 \ 0 X X 0 0 0 s # p X X # p X X h u [ X X e a s u [ X X [ [ [ b C X n u i b C X E A S r ] X X c t g r ] X X ] ] ] i X @ r h n i X @ n X X 2 n X X [ [ [ g X X 2 2 2 g X X e e e . X y y y . X x x x k . k . p p p b X c # b X c i i i x X o x X o r r r X m X m e e e X > X > s s s : : : X X X X 2 2 2 X X 0 0 0 X E X 2 2 2 C 5 5 5 X C X - - - X X 0 0 0 X X 4 4 4 X X - - - 0 0 0 X X 9 9 9 X X ] ] ] X X X X X X X X X X X X #

UID 设置

UID 可以用于 git commit 签名,这也是 github 力推的 verified signature

可以单独添加 git 使用的 UID:

g # g # g p p p g g g g p g - - - q q e u u d i i i c c t k k - - - k a s e d e y d U t - I - < u D p u k i r i e d i d y m i < a d f r i U y o n I - r g D u e i u r d s p i e r < d r i f n i i t n d > g > e ' r X p X r X i X n X t X > < ' X X X X X X X X X X X X @ u < s X e X r X s X . X n X o @ r u e s p e l r y s . . g n i o t r h e u p b l . y c . o g m i > t ' h u # b . c o m > g ' i t h u b

备份

# g # # g # g g g p p p p p g g g g g - - - - - a a a a a o o o o o p s s a e u ! e i u n b c g t c l - n h r i k - - - c e k k k - y e e e k . y y y e a . . . y s a a a . c s s s p c c c u b - e - - - x e e e - p x x x e o p p p x r o o o p t r r r o - t t t r s - - - t e s s s c e e e A r c c c 1 e r r r 2 t e e e 1 - t t t 2 k - - - 3 e k k k 7 y e e e 1 y y y 6 A A 1 F 9 B 6 2 9 6 3 F 1 B D 9 3 2 B 2 7 4 3 C 1 D 4 7 3 F E 4 1 8 1 7 6 6 4 4 # A 9 6 A 6 5 8 D F C 4 B 3 D 4 1 4 8 D 4 4 E E 6 4 3 4 1 k ! 6 2 B e ! ! ! y i d

备份策略:

  • 主密钥只保留一份,建议备份在一个全盘加密的 U 盘中,然后放在一个绝对安全的地方
  • 子密钥可以复制多份,通过 U 盘导入各个设备,专密专用,日常使用推荐用智能卡(比如 Yubikey),还能免去每次输密码的麻烦
  • 撤销凭证可以和主密钥放在一起备份一份, 另外单独备份一份(这样丢失密钥,起码还可以撤销)

导入 Canokey

g g g A g # g g g g g g g g g g g # g # g R A A V M S N L S U L S K M P S U S E A G s s s s p p p d p p p p p p p p p p p p p p e p p e a e a a a R o i e a I i I i n u e e s s s g g g m g g g g g g g g g g g g g g a p p r n r m n l L g g y x N g F g c t n c b b b / i / > > > > > > > > > > d l l s u i e g u i n . n n r h e > > > c n c e i i i f a u t o n a a r a s a y e r - - a a - - k k k k k k k k k s - r c c o a l o a a f t t P e t e t p n a c e r c r f e e e e e e e e e e a c a a n c f g t d u t I t u t u c t c t c l e c e e a d d o d C i d y y y y y y y y y v a t t t n e i p a r r N r r t r r i r i r d v d d r i > m > a n i t t t e r i i u u c o u t e i y e i e e o e c e k 2 2 2 2 d t m n g t 1 o 1 2 o 2 3 o 3 d o o r m a p n b a b l n a n a a a e 5 5 5 5 - - a a p o e - c c c - n n e b r r l P u e c c g k t t t t y 5 5 5 5 s c d n a k r k # a # a a s r e d e i I t n o o e e k e i e 1 1 1 1 t a m d s e p e r r r t I t r h f c N e g u u y d e d o d i 9 9 9 9 a r i s s y r y d d d a D y o s s t n n y n n / / / / t d n w i t p l k h t t . f A B 9 F u a d n A # u e d e s e e . k o 1 3 6 9 s # # r t 1 s e y r r . e . 2 9 D B e # 2 . . . . . . r . . . . . . . . . . . y . . 1 7 2 B # 1 : : : : : : : : : : : : : : : : : : : : : : : : 2 D 1 C a - 2 3 E F 3 l k 3 c c X O 3 C X [ [ [ [ f e 6 3 0 S X 2 X 2 X 2 s 7 7 1 8 a l e 7 a a X p . a X n n n n o d 4 i X 0 X 0 X 0 u 1 4 4 6 d o P y 1 r n X e 4 n X o o o o r 2 0 g X 2 X 2 X 2 b 6 A 6 9 m w I i 6 d o X n o X t t t t c 5 6 n X 3 X 3 X 3 A D 8 5 i e N d A k X P K X e 5 4 3 = - - - 6 B 4 C n d - 6 e X G e X s s s s d 1 o X 0 X 0 X 0 e F 1 4 D f F y X P y X e e e e 9 6 f X 4 X 4 X 4 d 3 4 D 8 o 3 s X s X t t t t 4 f X - X - X - 2 4 6 E E r 4 . X ] ] ] ] c X 1 X 1 X 1 5 4 1 4 3 1 m 4 o X v D 0 0 0 5 4 B 2 6 2 a 4 r X 2 e X X X 1 3 t g X 5 c X 0 X 0 X 0 9 4 # X 5 r X 8 X 8 X 8 / c c c c c c c 5 l O X 1 y X : X : X : F r r a r a r a 6 o p X 9 p 4 4 4 9 e e r e r e r n e X t X 9 X 7 X 9 B a a d a d a d g n X e = X : X : X : B t t - t - t - P X d o X 2 X 4 X 0 C e e n e n e n - G X 2 f X 1 X 7 X 7 3 d d o d o d o A K P X 5 f 8 : : : : : : : d X 5 X X X 6 m # P X 1 A X X X 9 2 2 F 2 F 2 F i I X 9 u X X X 5 0 0 1 0 1 0 1 n s V X t X X X C 2 2 D 2 D 2 D e X h D 3 3 0 3 0 3 0 P c O X = 8 - - - - I - A X o X X X E 0 0 X 0 X 0 X N k T X f X X X 3 4 4 X 4 X 4 X e H X f X X X 6 - - X - X - X k y X X X X 1 1 X 1 X 1 X e 0 X 2 0 0 X 0 X 0 X y i X X X X 0 X X X 1 i d X X X 2 X X X 2 d X X X 3 e e X e X e X 3 X X X - x x x x 4 0 p p p p 5 X X X 4 i i i i 6 X X X - r r r r 7 X X X 1 e e e e 8 X X X 0 s s s s : : : : X X X X X X X X n 2 2 2 X X X X e 0 0 0 X X X X v 2 2 2 X e 5 5 5 X X X X r - - - X X X X 0 0 0 X X X X 4 4 4 X X X - - - < 0 0 0 X 9 9 9 X X X X X X X @ X X X X X . c o m >

子密钥为 ssb> 表示本地只有一个指向 card-no: F1D0 XXXXXXXX 的智能卡指针,已经不存在私钥,现在可以直接删除主密钥,请再次确认已经备份完成

g p g - d e l e t e - s e c r e t - k e y s A 1 2 1 2 3 7 1 6 A 6 F 3 4 4 4

同时为了安全,你还可以将 gpg 的工作目录删除,Win:%APPDATA%\gnupg,Linux/macOS: ~/.gunpg

使用 Canokey

# g # g g # g p p p p g g g g / c - - a - i e r f m d d i p i > n o t g r C - f e t a c e r n a t p p o r c r u k d h i b e n l y t i c - - k k e e y y . i p d u - b f o r m a t l o n g - K

此时可以看到子密钥已经指向 Canokey,已经可以正常使用了,其他配置可以去 Web Console 进行配置

可能存在多个智能卡,切换后密钥指向错误的问题,可以使用以下命令刷新序列号:

# g p g - c C o a n r n d e c s t e - r a i g a e l n t n o " s c d s e r i a l n o " " l e a r n - f o r c e " / b y e

Git Commit 签名

g i t c o n f i g - g l o b a l u s e r . s i g n i n g k e y F 9 B B C 3 8 6 9 5 C D 8 E 3 6 # S i g n k e y i d

git commit 时添加 -S 参数即可使用 gpg 进行签名,也可在配置中设置自动 gpg 签名

g i t c o n f i g c o m m i t . g p g s i g n t r u e

提交到 Github 还需要前往 GitHub SSH and GPG keys 中添加公钥,添加完成后可以通过访问 https://github.com/<yourid>.gpg 来获取公钥

SSH Agent

以下操作在 Archlinux 环境下进行,Windows 操作类似,使用工具 WinCrypt SSH Agent 可以实现在 WSL 中进行配置

$ # $ # $ e d m p # e e g # s n e a i x x p s c w g a f x n p p g h d g r b a - e o o c - e e l u c n s r r o a ~ t p e l a t h t t n s d / - t c r e f s d . h s - h y l G S h g t v s c e - l P S - n t e h a - p G H - L u p - c t r r _ _ l p s " s h t o c T A a g : ^ u e l g T U u / # p - r Y T n / " p t 1 a = H c r o t 2 m " _ h a g r l 0 $ S w p t / ( O g . g 6 u t C p g - 0 s t K g i a r y = - t g / ) $ a h e b " ( g u n i g e b t n p n u . / g t s c p c e o i o r n n n c f e f o n n t z t r s - e y h l n - i t c s . u t c r ~ - o s / d m e . i / s z r d s s r h d r a u c g h e / n c t o - n s f s i h g - / s m o a c s k t e e t r ) / g p g - a g e n t . c o n f

将公钥添加至服务器的 ~/.ssh/authorized_keys 文件内即可,输入 ssh user@host,即可弹出输入 PIN 页面,输入 PIN 即可正常登录

如果一直出现

s i g n _ a n d _ s e n d _ p u b k e y : s i g n i n g f a i l e d : a g e n t r e f u s e d o p e r a t i o n

可能是由于这是 systemd 启动的 agent,而不是 X session 启动的,所以要么没有,要么是不可用的 tty,可以通过以下命令进行更新

g p g - c o n n e c t - a g e n t u p d a t e s t a r t u p t t y / b y e

PIV

PIV 目前还没进行研究,不过看博客可以实现 BitLocker 全盘加密,Archlinux 的免密登录等,以后有时间再慢慢研究吧

总结

总的来说,Canokey 也算是给我带来了一点小小的惊喜,基本满足我的需要,也缓解了没有买到 Yubikey 的遗憾,毕竟功能都差不多,甚至连文档都能互相用(),产品基本没什么太大的缺陷,对于日常使用还是足够的,使用 GPG 进行 Git Commit 签名以及 SSH 免验证登录体验还算不错,如果有类似的需求的话可以考虑考虑这款平替 Yubikey 的产品

参考

金枪鱼之夜:从 YutriKey 到 CanoKey

Canokeys

Document For Canokey

Canokeys Github

Canokey 指南:OTP,FIDO2,PGP 与 PIV

YubiKey-Guide