如何使用 GPG 密钥启用 SSH 访问进行身份验证

了解如何消除 SSH 密钥并使用 GNU Privacy Guard (GPG) 子密钥代替。
337 位读者喜欢这篇文章。
Team checklist and to dos

我们中的许多人都熟悉安全外壳 (SSH),它允许我们使用密钥而不是密码连接到其他系统。本指南将解释如何消除 SSH 密钥并使用 GNU Privacy Guard (GPG) 子密钥代替。

使用 GPG 不会使您的 SSH 连接更安全。SSH 是一种安全协议,SSH 密钥也是安全的。相反,它使某些形式的密钥分发和备份管理更容易。它也不会改变您使用 SSH 的工作流程。所有命令将继续按您期望的方式工作,只是您将不再拥有 SSH 私钥,而是解锁您的 GPG 密钥。

通过让您的 GPG 密钥验证 SSH,您将减少需要保护和备份的密钥文件数量。这意味着您的密钥管理卫生仍然必须良好,这意味着选择好的密码和使用适当的密钥保存策略。请记住,您不应该将您的私钥备份到云端!

此外,如今 SSH 密钥通常是手动且直接分发的。如果您想授予我对某台机器的访问权限,您必须向我索取我的 SSH 密钥。您可能会幸运地在我的网站上找到一个。但是,您仍然必须决定是否信任我的网站。如果我使用 GPG 密钥进行 SSH,您可以使用来自公共密钥服务器的 GPG Web of Trust 为我选择一个已知且良好的密钥。这就是 The Monkeysphere Project 正在努力的方向。否则,您在此处所做的一切都不会影响用于 GPG 加密和签名的 Web of Trust。

什么是 GPG 子密钥?

GPG 密钥实际上是密钥的集合。有一个主密钥,通常仅用于签名和认证。GPG 的建议用法是为加密创建一个子密钥。此子密钥是一个单独的密钥,在所有意图和目的上,都由您的主密钥签名并同时传输。这种做法允许您单独撤销加密子密钥,例如,如果它被泄露,同时保持您的主密钥有效。

重要的是要认识到 GPG 密钥包含多个密钥。为了备份和存储目的,您可以像操作一个密钥一样操作它们,但是当需要使用密钥时,您可以独立使用它们。

本练习将使用已创建用于身份验证的子密钥来完成 SSH 连接。此身份验证子密钥将完全取代您过去使用 ssh key-gen 生成的密钥对。如果您需要多个 SSH 密钥,您可以根据需要创建任意数量的此类密钥。

创建身份验证子密钥

您应该已经有一个 GPG 密钥。如果您没有,请阅读许多关于此主题的 优秀教程 之一。您将通过编辑现有密钥来创建子密钥。您需要在专家模式下编辑您的密钥才能访问适当的选项。

工作流程添加了一个新密钥,您可以在其中选择其功能——特别是,您希望切换其功能以仅具有身份验证。SSH 通常使用永不过期的 2048 位 RSA 密钥(在下面的选项中键入 8)。

以下是工作流程的编辑版本。此命令和所有其他命令均在 Fedora 29 上进行了测试。

$ gpg2 --expert --edit-key <KEY ID>
gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate 
Current allowed actions: Sign Encrypt 

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? s
Your selection? e
Your selection? a

Possible actions for a RSA key: Sign Encrypt Authenticate 
Current allowed actions: Authenticate 

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y

sec  rsa2048/8715AF32191DB135
     created: 2019-03-21  expires: 2021-03-20  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa2048/150F16909B9AA603
     created: 2019-03-21  expires: 2021-03-20  usage: E   
ssb  rsa2048/17E7403F18CB1123
     created: 2019-03-21  expires: never       usage: A   
[ultimate] (1). Brian Exelbierd

gpg> quit
Save changes? (y/N) y

启用 GPG 子密钥

当您使用 SSH 时,一个名为 ssh-agent 的程序用于管理密钥。要使用 GPG 密钥,您将使用一个类似的程序 gpg-agent,它管理 GPG 密钥。要使 gpg-agent 处理来自 SSH 的请求,您需要通过将行 enable-ssh-support 添加到 ~/.gnupg/gpg-agent.conf 来启用支持。

$ cat .gnupg/gpg-agent.conf 
enable-ssh-support

可选地,您可能希望预先指定用于 SSH 的密钥,这样您就不必使用 ssh-add 来加载密钥。为此,请在 ~/.gnupg/sshcontrol 文件中指定密钥。此文件中的条目是 keygrips——gpg-agent 用于引用密钥的内部标识符。与密钥哈希不同,keygrip 同时引用公钥和私钥。要查找 keygrip,请使用 gpg2 -K --with-keygrip,如下所示。然后将该行添加到 sshcontrol 文件。

$ gpg2 -K --with-keygrip 
/home/bexelbie/.gnupg/pubring.kbx
------------------------------
sec   rsa2048 2019-03-21 [SC] [expires: 2021-03-20]
      96F33EA7F4E0F7051D75FC208715AF32191DB135
      Keygrip = 90E08830BC1AAD225E657AD4FBE638B3D8E50C9E
uid           [ultimate] Brian Exelbierd
ssb   rsa2048 2019-03-21 [E] [expires: 2021-03-20]
      Keygrip = 5FA04ABEBFBC5089E50EDEB43198B4895BCA2136
ssb   rsa2048 2019-03-21 [A]
      Keygrip = 7710BA0643CC022B92544181FF2EAC2A290CDC0E

$ echo 7710BA0643CC022B92544181FF2EAC2A290CDC0E >> ~/.gnupg/sshcontrol

最后,您需要告诉 SSH 如何访问 gpg-agent。这是通过更改 SSH_AUTH_SOCK 环境变量的值来完成的。以下两行添加到您的 ~/.bashrc 时,将确保变量设置正确,并且代理已启动并准备好使用。

$ cat ~/.bashrc
...
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
...

要继续,请在当前会话中执行这些命令。

分享您的 SSH 密钥

为了使用 SSH,您需要与远程主机共享您的公钥。您有两个选择。首先,您可以运行 ssh-add -L 列出您的公钥并手动将其复制到远程主机。您也可以使用 ssh-copy-id。从这个角度来看,没有任何改变。

恭喜!

您现在已经使用 GPG 密钥启用了 SSH 访问进行身份验证!SSH 将继续按预期工作,并且您连接的机器无需任何配置更改。您减少了需要管理和安全备份的密钥文件数量,同时还启用了参与不同形式的密钥分发的可能性。保持安全并实践良好的密钥卫生!

在下一篇文章中,我将分享一些关于如何导入您现有的 SSH 密钥的技巧,以便您可以继续使用它们,但使用 GPG 身份验证。

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

评论已关闭。

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