如何管理多个 SSH 密钥

将您的安全备份需求减少到单个密钥文件。
192 位读者喜欢这个。
Data stack in blue

在本系列的头两篇文章中,我分享了如何使用您的 GPG 密钥来验证您的 SSH 连接,以及如何导入现有的 SSH 密钥。一旦您使用超过两到三个 SSH 密钥,管理它们可能会变得更加复杂。在最后一篇文章中,我将解释如何使用控制文件管理多个 SSH 密钥,以及如何进行更改以将它们作为 GPG 身份验证子密钥进行管理。我还将展示如何在您的 GPG 身份验证密钥随着时间的推移而积累,并且您没有做笔记的情况下识别它们。

为什么要拥有多个 SSH 密钥?

如果您像考虑物理钥匙一样考虑 SSH 密钥,您将开始看到拥有多个密钥的原因。您不会希望将您的汽车和房屋放在同一把钥匙上。如果您的钥匙被盗,小偷可以访问所有东西。就像您的汽车和房屋一样,您可能希望为每个项目、用例或您生活的各个方面使用单独的密钥。

当您为客户工作时,拥有多个密钥也很有用。一些客户可能会给您一个特定的密钥来使用,而另一些客户可能要求您在项目结束时交出所有帐户、密码和密钥。

SSH 如何管理多个密钥?

一旦您拥有超过几个 SSH 密钥,您就会发现您需要在您的 ~/.ssh/config 中添加 IdentifyFile 行,以便让 SSH 向正确的服务器提供正确的密钥。这是因为大多数服务器在尝试几次 SSH 密钥后会断开连接。我有七个密钥,所以我肯定需要这个。

例如,此条目指定当我使用 Fedora 项目中的机器时,我的用户名是 "bex",并且我希望使用我的 Fedora SSH 密钥。引用的文件是私钥文件。

Host *.fedoraproject.org
    User bex
    IdentityFile ~/.ssh/fedora_id_rsa

如果没有 IdentifyFile 关键字,SSH 将只串行尝试每个密钥。

教 SSH 管理多个 GPG 身份验证密钥

当您使用 GPG 来验证 SSH 时,您不再拥有私钥文件。因此,上面的配置将不再起作用。为了使这项工作正常进行,您必须做一些不同的事情来识别应该使用的密钥。幸运的是,SSH 提供了一个解决方法:您可以在 IdentifyFile 行上引用公钥。

只需修改您的 ~/.ssh/config 以引用正确的公钥。通常,这就像在每个 IdentifyFile 行的末尾添加 pub 一样简单。不要忘记确保公钥文件设置为仅用户可读。

这意味着您将需要为您的身份验证密钥提供公钥文件。如果您没有保存它们(或之前没有),您可以从 ssh-add -L 命令中获取指纹。

识别特定的身份验证子密钥

一旦您创建了多个身份验证子密钥,您将希望能够识别它们,以便您可以将正确的公钥提供给正确的服务器,并进行正确的 IdentifyFile 条目。不幸的是,GPG 不支持子密钥的注释或名称。因此,您只能从 gpg2 命令获取密钥哈希和密钥柄列表,以及从 ssh-add 获取一组不匹配的私有和公共指纹。

有两种方法可以识别您的密钥。您可以从 SSH 公钥指纹开始,找到 GPG 密钥柄,或者您可以从 GPG 子密钥哈希开始,找到 SSH 公钥指纹。

SSH 公钥指纹到 GPG 密钥柄

首先找到您要识别的公钥指纹。您可以通过运行 ssh-add -L 来做到这一点。此示例适用于第一个指纹。将公钥指纹保存到文件中,因为下一步需要这样做。

$ ssh-add -L | head -1 > key

现在您需要 SSH 指纹的 MD5 格式,您可以从 ssh-keygen 获取。

$ ssh-keygen -l -E md5 -f key
2048 MD5:9e:98:82:87:5d:a4:fe:e3:8a:9c:db:aa:59:5b:30:ac (none) (RSA)

将 MD5 SSH 指纹与密钥匹配,如 gpg-agentkeyinfo 命令所显示的那样。

$ gpg-connect-agent 'KEYINFO --list --ssh-fpr' /bye | fgrep
9e:98:82:87:5d:a4:fe:e3:8a:9c:db:aa:59:5b:30:ac
S KEYINFO 9EEA76057C168686EAE8B807845326D7F60FB1C4 D - - - P
MD5:9e:98:82:87:5d:a4:fe:e3:8a:9c:db:aa:59:5b:30:ac - -

这会返回多个数据字段。重要的是第三个元素,它是 GPG 密钥柄。从这里,使用 gpg2 -K --with-keygrip 可以很容易地识别您的特定身份验证子密钥。

GPG 子密钥哈希到 SSH 公钥指纹

首先找到您要识别的密钥的子密钥哈希。您可以通过运行 gpg2 -K --with-subkey-fingerprint 来做到这一点。

$ gpg2 -K --with-subkey-fingerprint
...
ssb   rsa2048 2019-03-16 [A]
      941BE28372F6759AB7073766E0A70B46BA68E808

将其转换为公钥指纹非常容易;只需再次使用 gpg2

$ gpg2 --export-ssh-key 941BE28372F6759AB7073766E0A70B46BA68E808
ssh-rsa AAAAB3NzaC1yc...MQJ3FK3 openpgp:0xBA68E808

您会注意到此输出中有一个注释,openpgp:0xBA68E808。这在所有情况下都不能保证,因为它取决于您如何使用 GPG。如果您的输出包含它,这是一个识别 GPG 密钥和 SSH 指纹关系的简单方法;但是您不应该依赖它始终可用。

我鼓励您考虑在您的 .gnupg/sshcontrol 文件中或作为公钥文件中的注释记录这些关系。

总结

现在您已准备好使用 GPG 身份验证的 SSH 会话访问世界上的每台服务器。您可以管理多个密钥,并在需要时识别它们。您已将您的安全备份需求减少到单个密钥文件,您可以使用该文件解锁或解密其他所有内容。

接下来阅读什么
User profile image.
Brian "bex" Exelbierd 是 RHEL 社区业务负责人,致力于通过社区努力为 RHEL 路线图提供信息,并支持操作系统社区。在红帽,Brian 曾担任技术作家、软件工程师、内容策略师、社区架构师,现在担任产品经理。

2 条评论

您可以将它们放在任何您想要的位置,但它们的权限和父文件夹的权限需要严格

父文件夹没有可写访问权限(对于其他人和所有人)
公钥为 644
私钥为 600。
然后你

在 ~/.ssh/config 文件中声明这些不同的密钥(此处示例)
更改远程 url 以便使用 ~/.ssh/config 文件的适当条目,该条目描述了要使用的正确 ssh 密钥。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.