如何使用 ssh-agent 从 ~/.ssh/config 文件提供主机特定密钥并管理密码?

如何使用 ssh-agent 从 ~/.ssh/config 文件提供主机特定密钥并管理密码?

我在 ~/.ssh/config 文件中为它们配置了不同的主机和密钥。但是,为了管理不同密钥的密码,我通过 ssh-add 命令向 ssh-agent 添加密钥来寻求帮助。现在,当我 ssh 主机时,代理会一一提供它拥有的所有密钥。

我搜索了如何限制 ssh-agent 的这种行为,并使用

IdentitiesOnly yes

在所有主机的配置文件中。

通过这样做,我成功地限制了 ssh-agent 提供其拥有的密钥,但是 ssh-agent 不再管理密码短语,我每次 ssh 时都必须输入密码短语。

有没有办法只渲染我正在 ssh 的特定主机的密钥(从 ~/.ssh/config 文件中读取)并管理密码?

答案1

该问题可以通过执行以下操作来解决:

  1. 编辑客户端的~/.ssh/config文件,使主机条目具有以下内容:

    Host fooName
        Hostname foo.name.tld
        User usrname
        IdentityFile ~/.ssh/fooName.pub
        IdentitiesOnly yes
    

    请注意,该IdentityFile指令指的是民众密钥而不是私钥文件。

  2. 使用 向 ssh-agent 添加相关私钥ssh-add。此时系统应该提示您输入密码。

答案2

您可以指定一个民众密钥通过IdentityFile,如果私钥被加载,ssh-agent它将被使用。否则,它将被视为私钥,并可能生成有关不受保护的私钥文件的错误。

  1. 确保ssh-agent正在运行
  2. 将您的身份添加到代理中ssh-add ~/.ssh/id_rsa
    • 如果出现提示,请响应密码质询
  3. 添加您的身份民众的关键~/ssh/config,例如:
Host *
  IdentityFile ~/.ssh/id_rsa.pub   # Public key, SSH will consult ssh-agent
  IdentitiesOnly yes

你为什么想做这个?

加密私钥是最佳实践,但每次使用密钥时都必须响应密码质询,这很不方便。ssh-agent提供了一种缓存解密密钥的方法,因此您只需偶尔响应密码质询即可解密它们。

但这会产生一个新问题:某些主机限制在关闭连接之前它们可以容忍的身份验证错误数量。如果您ssh-agent有很多密钥,那么您可能会遇到此问题,表现为“身份验证错误太多”。

为了避免这种情况,您可以指定IdentityFile给定主机,并且仅使用该身份。这巧妙地避免了“太多身份验证错误”,但现在每次使用密钥时都必须响应密码质询,本质上绕过了ssh-agent方便的缓存机制!

如果您知道 中存在身份(私钥)ssh-agent,则可以ssh通过指定来使用它民众密钥的一部分,足以找到您所引用的私钥,而无需直接访问它。

您可以使用私钥添加/修改/删除密码ssh-keygen -p

关于ssh-agent

ssh-agent永远不会向任何进程提供解密的密钥。相反,将ssh其收到的加密质询发送至ssh-agent,然后返回质询响应。这可以保证您的私钥安全,但也允许ssh-agent进行隧道传输,因此远程系统可以访问您的身份(只要您保持连接)。参见man ssh_configForwardAgent

故障排除

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/meermanr/.ssh/id_rsa.pub' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/meermanr/.ssh/id_rsa.pub": bad permissions

这意味着ssh-agent没有运行,或者没有加载关联的标识。检查加载了哪些身份ssh-add -l,例如:

# ssh-add -l
The agent has no identities

加载私人的身份密钥ssh-add ~/.ssh/id_rsa

# ssh-add /Users/meermanr/.ssh/id_rsa
Enter passphrase for /Users/meermanr/.ssh/id_rsa
Identity added: /Users/meermanr/.ssh/id_rsa (/Users/meermanr/.ssh/id_rsa)

查看:

# ssh-add -l
4096 SHA256:2Mn+jr5imURFStSWVaDHXhhx+6cyXXBoNjOfPLy2thQ /Users/meermanr/.ssh/id_rsa (RSA)

再试一次。

相关内容