公司政策要求将一些 ssh 密钥安全存储,例如存储在专用 USB 设备上。使用 gnupg 可以完美地使用未存储在主机上的密钥enable-ssh-support
,即使使用多个密钥也是如此:
Host example.com
HostName ssh.example.com
IdentityFile ~/.ssh/smartcard.pub
Host example.net
HostName git.example.net
IdentityFile ~/.ssh/another-smartcard.pub
Host example.org
HostName sftp.example.org
IdentityFile ~/.ssh/id_rsa.pub
IdentitiesOnly yes
PasswordAuthentication no
PubkeyAuthentication yes
但是,当拔下硬件时,gpg 会从代理中删除密钥,随后的 ssh 调用将导致:
Enter passphrase for key '/home/user/.ssh/smartcard.pub':
这看起来很奇怪,因为 ssh 和 ssh-agent 都应该很清楚该文件只包含一个公钥。如果无法访问指定的密钥,是否有一个好的方法可以让 ssh 详细失败,而不是要求输入(毫无意义的)密码?
不完整的解决方案:
- 删除
IdentitiesOnly
- ssh 将尝试所有可用的键正如预期的那样 - 但会导致服务器限制每个会话的身份验证尝试次数 - 以某种方式包装 ssh
alias ssh='grep ^4096 <(ssh-add -l)' && ssh'
- 可以工作,但如果有人想知道为什么他的 ssh 设置被破坏了,就会很麻烦
答案1
使用 OpenSSH 7.9 或更高版本,它至少会打印一些错误:
$ ssh example.com
Load key "/home/user/.ssh/smartcard.pub": invalid format
[email protected]: Permission denied (publickey).