有没有可以用Yubikey直接进行RSA解密的工具?

有没有可以用Yubikey直接进行RSA解密的工具?

我正在寻找的用例是我走到一个无头的服务器并使用硬件密钥“解锁”它,服务器上的脚本识别出我已将其插入并自动使用它,而无需 PIN 码或密码或其他因素。

实现这一点的最原始方法是拥有一个带有未加密的原始 AES 密钥的 USB 拇指驱动器,服务器上的脚本可以找到并使用该密钥来解密内容。缺点是 USB 记忆棒可以被复制,并且如果丢失则无法撤销。如果在脚本仍在使用该驱动器时移除该驱动器,它还会遇到 U 盘本身的文件系统可能损坏的问题。

智能卡或 Yubikey 似乎是这些问题的明显解决方案,但似乎大多数描述 Yubikey 解决方案的人都将其与 gpg 配对作为第二个身份验证因素。我不需要“额外”的身份验证因素,我希望密钥是多种可能的解密方法之一。我不想在每个主机上配置 gpg 或拥有“身份”或到期日期或信任链或任何其他内容。另一个流行的选项是将其与 LUKS 集成,但我希望有一个更多的非 root 用户空间选项。

我只想获取加密的 AES 密钥,并直接要求 Yubikey 使用硬件中的 RSA 私钥对其进行解密(无需输入 PIN 码或密码,但在设备上短按或长按即可)。

有没有现有的工具可以实现这一点?脚本语言库也很好。

答案1

假设您在现代 Linux 或类似系统上运行,加密部分应该相当简单。

(编辑:再次阅读你的问题,我看到你了开始了通过询问身份验证,然后询问有关 RSA 加密的具体问题,我已在此回答。您可能想要按照我在此处描述的方式进行设置,然后去研究 pam_pkcs11,它旨在执行此类操作。)

设置

确保您的 Yubikey 已启用“PIV”模式,并且您已安装可以与其通信的 OpenSC PKCS#11 模块。还要安装 OpenSSL PKCS#11“引擎”。

使用Yubico-piv-工具或您喜欢的任何其他方法将 RSA 密钥安装到投币口您的选择,例如“卡验证插槽 9e”。您可以导入现有密钥,也可以创建 Yubikey 之外从未存在的密钥。

签约

现在很简单了。任何可以使用文件中的 RSA 密钥的软件 应该接受一个标准PKCS#11 URI而是识别 Yubikey 中的密钥。

卡身份验证槽中密钥的 URI 类似于'pkcs11:manufacturer=piv_II;id=%04'

所以你可以做类似的事情

 echo "test payload" | openssl dgst -sha256 -sign 'pkcs11:manufacturer=piv_II;id=%04' -hex

...除了 OpenSSL 没有相当还没有做好,所以你必须添加

 -engine pkcs11 -keyform engine

到上面的命令行,因为所有加密软件作者都讨厌他们的用户,并且懒得去推断这些明显的事情来自于你给它一个 PKCS#11 URI 的事实。这也是轻微地过时了,因为较新的 OpenSSL 使用“提供者”而不是引擎,我认为它仍然不仅仅让事情本身变得正确,所以你可能需要稍微不同的毫无意义的奥术咒语让它这样做。

不错的软件惯于需要这些额外的提示,并且只会用 URI 代替文件名并执行正确的操作。如果没有,请提交错误。

例子

 $ yubico-piv-tool -s9e -ARSA2048 -agenerate | tee pubkey.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr9LrzjNbRABqhDQrGi3l
VcQhmUu0lls8k4XnO8c/U0oS6IvH4H7HuqXFfwThYofxIgA2eIXuRXf+V/CSWtXN
40Bb10QKcTXVATm05+KFNWg1GCVg2yrvsUOQSd6MOxAa5goUUi2xOjeLFZRvXuvt
YmLytwY77YqE0WOHYfYuk9kolueZHhq4BSOVRmQpZxKd6/MkWlT46SPc3Bwbyx41
t2U42vlnHYuma3NF6qI+a+LaMyvkFVBkRM6A1WB2u5jjl/ZQmyYsuqg2e8xu7P8m
5/GUH9HjD074+ea1NEdMncPhKjO+pL24BSebtIPUmzEJIh6kCaweJYiMKYuLx15H
HQIDAQAB
-----END PUBLIC KEY-----
Successfully generated a new private key.
$ echo Test | openssl pkeyutl -encrypt  -pubin -inkey pubkey.pem > Test.enc
$ openssl pkeyutl -decrypt -in Test.enc -engine pkcs11 -keyform engine  -inkey 'pkcs11:manufacturer=piv_II;id=%04'
Engine "pkcs11" set.
Test

还可以签名...

 $ echo Test | openssl dgst -sha256 -sign 'pkcs11:manufacturer=piv_II;id=%04' -engine pkcs11 -keyform engine  > signature.bin
 $ echo Test | openssl dgst -sha256 -verify pubkey.pem -signature signature.bin
Verified OK

长话短说

Yubikey PIV 中的不同插槽有不同的策略,特别是关于是否需要 PIN 的策略。阅读我链接的文档。看https://www.infradead.org/openconnect/pkcs11.html有关更多提示发现令牌中给定对象的 URI。

答案2

免责声明:我从来没有用过 Yubikey

一些背景

看起来 Yubikey 支持许多协议,包括 OpenPGP。然而它并不声称支持“普通旧式”RSA。在 IO 深处的某个地方,Yubikey 可能会被要求对某些内容进行 RSA 解密,这并非不可能,但这似乎没有公开记录。

相反,从所有意图和目的来看,Yubikey 直接实现了许多协议,最多其中重点是身份验证(不是您想要的)。

这实际上可能是有充分理由的。 AFAIK 专家认为使用 RSA 加密大量数据不是一个好主意。相反,主要协议通常使用对称密钥加密批量数据,然后使用 RSA 加密[小得多的]对称密钥。

加密方面你可能会犯很多错误,而且你永远不会知道,直到有人滥用这个错误,所以发明自己的协议通常是一个坏主意。

使用 Yubikey 加密和解密数据

虽然这在技术上不是您所要求的,但它似乎实现了您的目标。也就是说,您希望能够加密只能在硬件 Yubikey 的帮助下解密的内容。

OpenPGP 是一种完善的加密协议,可用于使用 RSA 加密文件。从技术上讲,它使用对称密钥加密文件,然后使用 RSA 加密对称密钥。它也可以在大多数 *nix 操作系统上轻松使用。

Yubikey 支持 OpenPGP(AKA gpg),并且可以单独使用,而不仅仅是作为 2FA。更准确地说,Yubikey 可用于安全地存储您的 RSA 私钥,与将其存储在常规 USB 笔式驱动器上不同,它可以帮助解密 OpenPGP 加密文件,而无需将私钥暴露给主机!

gpg-agent是处理 gpg 密钥的后端看这里gpg-agent应该能够直接与 Yubikey 交互来解密文件看这里:

gpg-card 用于管理智能卡和 USB 令牌。它提供了一系列功能的超集,从gpg --card-edit可被视为前端的功能到由其启动的用于处理智能卡的scdaemon守护进程。gpg-agent

有一篇博文“使用 Yubikey 存储 SSH 密钥 (RSA 4096)” 其中解释了如何要求 gpg 在 Yubikey 上存储 RSA 密钥。需要注意的重要行是:

gpg> keytocard

...还记录了这里

从那里您需要做的只是加密或解密您想要使用的任何数据

# Recipient identifies which public key to encrypt with
gpg --encrypt <filename> -r <recipient ... you>

gpg --decrypt <filename>

相关内容