在本系列的头两篇文章中,我分享了如何使用您的 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-agent 的 keyinfo 命令所显示的那样。
$ 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 会话访问世界上的每台服务器。您可以管理多个密钥,并在需要时识别它们。您已将您的安全备份需求减少到单个密钥文件,您可以使用该文件解锁或解密其他所有内容。
2 条评论