强制使用 gpg-key 作为给定服务器的 ssh-key

强制使用 gpg-key 作为给定服务器的 ssh-key

我将 ssh 配置为使用 GPG 作为我的 ssh 代理,如果我删除该~/.ssh文件夹,我可以使用我的 gpg 密钥顺利 ssh 到我的服务器。但是,我的~/.ssh文件夹中有十几个不同的 ssh 密钥,如果我尝试在那里 ssh,我会收到权限被拒绝错误,因为我的 ssh 客户端在尝试 gpg ssh 代理中的密钥之前提供了目录中的每个私钥。

使用常规 ssh-keys,我只需使用文件IdentityFile中的配置~/.ssh/config,但我无法这样做,因为我的身份是 gpg cardno。我很困惑为什么 ssh 更喜欢密钥文件而不是代理。有没有办法强制 ssh 使用代理而不是文件?或者更好的是,有没有办法在文件中指定~/.ssh/config必须对给定服务器使用 gpg 密钥?

我已经确认它ssh-agent没有运行,并且它gpg-agent正在运行并ssh-add -L显示我的 gpg 密钥存在,以及另一个 ssh 样式的私钥。

答案1

我不能这样做,因为我的身份是 gpg cardno。

使用IdentityFileIdentitiesOnly,甚至使用 gnupg 提供的身份。

  • 如果您有卡,请从您的代理导出公钥:

    $ ssh-add -L | grep "cardno:.*789$" | tee ~/.ssh/smartcard.pub
    ssh-rsa AAAA[..]== cardno:023456000789
    
  • 如果您没有,但记得它与哪个键相关联,请从 gnupg 导出:

    $ gpg2 --export-ssh-key [email protected] | tee ~/.ssh/smartcard.pub
    ssh-rsa AAAA[..]== openpgp:0xDEADBEEF
    

然后告诉 ssh 使用该导出来识别正确的密钥:

Host *.host.example
    IdentityFile ~/.ssh/smartcard.pub
    IdentitiesOnly yes
    PasswordAuthentication no
    PubkeyAuthentication yes

当 gnupg 检测到正确的智能卡时,它将按预期为您提供一次登录尝试:

$ ssh -v smart.host.example
[..]
debug1: Next authentication method: publickey
debug1: Offering public key: /home/home/.ssh/smartcard.pub RSA SHA256:a1337[..] explicit

不幸的是,你得到相当无用的输出每当您忘记插入卡时,gnupg ssh 代理不会要求插入正确的卡,就像gpg 代理确实如此。这很烦人,但不会影响您的实际使用。

答案2

man ssh_config关于 IdentityFile 的说明:

此外,身份验证代理所代表的任何身份都将用于身份验证。

因此,如果您设置IdentityFile /dev/null,那么一次身份验证将会失败,然后 ssh 将继续尝试代理中的密钥。

答案3

如果您的密钥存储在某种支持 pkcs11 的硬件(例如智能卡)上,您可以直接使用 ssh 来访问它。

命令行界面

 -I pkcs11
         Specify the PKCS#11 shared library ssh should use to communicate with a PKCS#11 token providing the user's private RSA key.

因此您可以使用ssh -I /path/to/opensc-pkcs11.soopensc-pkcs11.so 作为您的智能卡库。

代理人

如果你想使用 ssh-agent,你也可以使用以下方式添加智能卡支持的密钥:ssh-add -s /path/to/opensc-pkcs11.so

配置

最后,如果你想使用配置文件,请指定一个 PKCS11 设备,你可以使用PKCS11Provider

 PKCS11Provider
         Specifies which PKCS#11 provider to use.  The argument to this keyword is the PKCS#11 shared library ssh(1) should use to communi-
         cate with a PKCS#11 token providing the user's private RSA key.

相关内容