RSA/ECC密码算法实现细节、关于密码产品在大陆境内的合法性等问题不在本文讨论范围。
手上的Yubikey 5 NFC一直以来都是我2FA的设备之一,这阵子也偶然了解到CanoKey这款产品,也是和Yubikey比较类似,看了不少关于GPG/PGP相关的文章,于是乎想要自己实践一下。#(深思)
比较让人熟知的Yubikey,或者硬件密钥的用法都是U2F、TOTP/HOTP之类的。我手上的这款Yubikey 5 NFC也支持PIV和OpenPGP标准。值得注意的是,PIV和OpenPGP的密钥存储区不共享,分别是X.509和GPG密钥。X.509和OpenPGP两者即使能互相转换,也不应该混为一谈,OpenPGP对S/MIME的X.509有一些支持,但不能逐字使用X.509 PrivateKey。在我看来X.509和OpenPGP在使用上的区别主要体现在,X.509被设计成有一套严格的层次化的证书颁发机构,即为CA,机构背书下的绝对信任。而OpenPGP是任何人都可以签名,从而证明其他人密钥证书的有效性,是属于比较偏社交化的。
在Windows上和PIV以及OpenPGP进行交互都不是那么的方便,这边推荐这个库,来帮助实现简单的证书读取、链接等功能。#(赞一个)
生成主密钥
在这一步中,会选择密钥的算法、有效期、UserID、Email等信息。
请注意密钥算法是否被你的硬件密钥所支持,同时记得备份好吊销执照。
在这一步中比较重要的是,选择主密钥的功能。大家有不同的分配。一个密钥可以担任Encr、Auth、Sign、Certify,这四种功能,分别为加密、鉴权、签名、认证。我的做法是,主密钥仅保留认证C功能,然后分别签发出E、A、S三种子密钥,存放在硬件密钥中。主密钥做好脱机备份,大部分时间的物理隔离即可。
生成子密钥
需要填写的是主密钥的指纹,这个可以通过列出密钥来查看。
后面依次指定子密钥的加密算法、用途、有效时长。
上述所有步骤都是在本机上进行的,也可以直接使用OpenPGP Card规范中,在硬件中生成密钥的功能。
我们需要导出公钥以及各密钥的私钥,以便进行其他工作。
在继续行文之前,也要提一下,本节内容具有一定争议。主要体现在以下两点:
- OpenPGP密钥是否可以和SSH所用的密钥进行互换?
- 操作是否具有一定的安全风险?
对于上述第一个问题,SSH认证一般都使用的是RSA密钥,但从目前的OPENSSL以及OPENSSH支持范围来看,无论是ECC还是RSA算法,都是支持的。此外和X.509体系不同的是,PGP和SSH密钥「这里使用了非标准的表述方式」都是解决主观或客观无背书下的相互信任。
第二个问题,有人认为,PGP体系的公钥公开会影响安全。但拥有公钥并不能推导出私钥。
但两种情况下我认为会在某些角度影响安全性。
- 主私钥泄密情况下,公钥吊销是否能及时同步到目标机上?答案是否,目前SSH还不是这个机制
- 在多处使用同一个私钥是否会导致问题?
我个人硬件密钥想要解决的是场景是,使用非可信设备进入可信区进行操作的问题,所以只要控制好私钥副本的传播即可(硬件密钥无法拷出私钥)。
使用openpgp2ssh工具,位于monkeysphere包内,Linux和MacOS均有提供
或者下述更容易理解的方式
请注意,openpgp2ssh工具目前无法处理加密的私钥,会提示:We cannot handle encrypted secret keys. Skipping!
本节内容使用了Yubikey的PIV功能,存储先前所述的子密钥,用于部分验证场景。
由于在Win平台上,部分软件并不能调用OpenPGP Card,只能调用PIV区域的密钥,所以就略显手足无措。
创建X.509请求
期间会需要输入一些证书信息,这些本质上是给CA用于签发的,我们按需填写即可。
自行签发
Putty SSH 等原生软件
公钥导出在先前内容中都有提到,不再阐述。
需要将输出的结果放入环境变量,使用起来如下图,就很Nice#(赞一个)
我们可以很轻而易举的在SSH、Git等场景下使用。
需要用到PIV区,以及WinCryptSSHAgent软件
(https://github.com/buptczq/WinCryptSSHAgent/)
XShell官方的方法是使用PCKS#11验证,要装插件来实现,本节就不再阐释了。
请注意导入的密钥位数,PIV区支持的密钥位数和OpenPGP不一致,一般最大只支持2048,子密钥都是3072的就只能干瞪眼了。
WinCryptSSHAgent需要在XShell打开前启动
上述操作的主要目的是向槽位分别写入公钥与私钥。若写入后提示无法使用该智能卡,可能是在写入时有问题,可以尝试清空9a槽后重新执行导入操作。
本文主要记录了Yubikey这类硬件密钥配合SSH场景认证的使用方式,事实上Yubikey的部分功能并不是智能卡和OpenPGP Card的完整实现,部分内的功能并不能百分百匹配上,作为认证场景使用,对我来说可能是目前Yubikey最主要的一个用处了。