使用 gpg-agent 和另一个密钥源进行 SSH 身份验证?

使用 gpg-agent 和另一个密钥源进行 SSH 身份验证?

总结: 有没有办法禁用持久导入功能gpg-agent或解决这个问题以允许使用不同的 SSH 密钥源?

情况

我用GnuPG 2 密钥(在 YubiKey 上)通过 进行 SSH 身份验证gpg-agentenable-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 允许您导入软件生成的密钥。)

  1. 设置 PIN 码(以及用于解锁忘记的 PIN 码的 PUK 码)。 PIN 码和 PUK 码都必须是字母数字,且长度必须为 6-8 个字符:

    ykman piv change-pin -P 123456
    ykman piv change-puk -p 12345678
    
  2. 生成一个密钥以及一个自签名证书(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或 GnuTLS p11tool):

    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
    
  3. 以authorized_keys格式导出​​公钥:

    ssh-keygen -D opensc-pkcs11.so > Yubikey.pub
    
  4. 连接时使用ssh -I选项或PKCS11Provider设置。(每次都会提示您输入智能卡 PIN 码 - 如果需要,请设置 SSH 连接多路复用以减少这种情况。)

这种方法还有其他优点:它在 Windows 上也非常容易使用,因为 Windows 已经有 PIV 智能卡的驱动程序(例如通过 PuTTY-CAC 或将 CAPI/CNG 密钥存储桥接到 SSH 客户端的其他几个项目)。

相关内容