总结: 有没有办法禁用持久导入功能gpg-agent
或解决这个问题以允许使用不同的 SSH 密钥源?
情况
我用GnuPG 2 密钥(在 YubiKey 上)通过 进行 SSH 身份验证gpg-agent
。enable-ssh-support
这很有效。
我有其他键可用(文件系统和 KeePassXC)。当使用ssh-add
或 KeePassXC 添加这些时,它们由 导入gpg-agent
并存储在 中~/.gnupg/private-keys-v1.d/
。我需要提供额外的密码来加密它们。
问题
这正如广告所说的那样有效,但却违背了将密钥存储在其他地方的目的:
- 我希望 KeePassXC临时添加密钥
ssh-agent
解锁密码数据库时,密钥将恢复到当前状态。此后,密钥不应永久可用。 - 与
ssh-add
从 shell 中输入密钥文件类似:我不想导入并保留这些文件,同时还必须提供更多密码。
如何在允许使用所有密钥源的同时避免导入?我的一个想法是在同一台机器上设置多个代理,可能gpg-agent
转发到本地ssh-agent
,但这听起来可能过于复杂。
类似的问题属于这个 KeePassXC 问题,但没有提出任何解决方案。
答案1
第三种选择:不要通过 gpg-agent 使用 Yubikey,而是通过 PKCS#11 使用其 PIV 智能卡支持。OpenSSH 原生支持此功能,方法是PKCS11Provider
:
ssh -I opensc-pkcs11.so root@myhost
ssh-agent 也可以识别 PKCS#11 密钥:
ssh-add -s opensc-pkcs11.so
(Yubico 还提供了其自己的 Yubikey 特定libykcs11.so
模块作为 yubico-piv-tool 的一部分,但由于后者现在已被弃用,我认为 libykcs11.so 也已被弃用,您应该只使用 OpenSC 的通用 PIV 支持。实际上,这两个模块可以互换,并且可以毫无问题地识别彼此的对象。)
请注意,Yubikey 的 OpenPGP 和 PIV 小程序是完全独立的,您无法在它们之间移动密钥,因此如果它是硬件生成的密钥对,您很遗憾需要使用创建一个新的密钥对ykman piv
。(不过 Yubikey 允许您导入软件生成的密钥。)
设置 PIN 码(以及用于解锁忘记的 PIN 码的 PUK 码)。 PIN 码和 PUK 码都必须是字母数字,且长度必须为 6-8 个字符:
ykman piv change-pin -P 123456 ykman piv change-puk -p 12345678
生成一个密钥以及一个自签名证书(SSH 不会关心):
ykman piv info ykman piv generate-key -a ECCP256 9a /tmp/9a.pub ykman piv generate-certificate 9a /tmp/9a.pub -s "Thomas" -d 3650 rm /tmp/9a.pub
如果您没有较新的版本
ykman
,则可以使用较旧的版本yubico-piv-tool
甚至各种通用 PKCS#11 工具(例如 OpenSCpkcs11-tool
或 GnuTLSp11tool
):yubico-piv-tool -a change-pin -P 123456 yubico-piv-tool -a change-puk -P 12345678 yubico-piv-tool -a status yubico-piv-tool -a generate -A ECCP256 -s 9a -o /tmp/9a.pub yubico-piv-tool -a verify-pin -a selfsign-certificate \ -s 9a -S "/CN=Thomas" -i /tmp/9a.pub -o /tmp/9a.crt yubico-piv-tool -a import-certificate -s 9a -i /tmp/9a.crt
以authorized_keys格式导出公钥:
ssh-keygen -D opensc-pkcs11.so > Yubikey.pub
连接时使用
ssh -I
选项或PKCS11Provider
设置。(每次都会提示您输入智能卡 PIN 码 - 如果需要,请设置 SSH 连接多路复用以减少这种情况。)
这种方法还有其他优点:它在 Windows 上也非常容易使用,因为 Windows 已经有 PIV 智能卡的驱动程序(例如通过 PuTTY-CAC 或将 CAPI/CNG 密钥存储桥接到 SSH 客户端的其他几个项目)。