将我的 SSH 密钥导入为 GPG 子密钥以用于 SSH 身份验证

将我的 SSH 密钥导入为 GPG 子密钥以用于 SSH 身份验证

我最近创建了一个 PGP 密钥来签署我的提交,并且它工作正常。我还发现 gpg 与我的操作系统 (Kubuntu) 的集成比 ssh-agent 更好。

我很懒,希望避免在我可以访问的所有不同服务器中替换我的 SSH 密钥。

我是否可以选择导入现有的 SSH 密钥作为 PGP 密钥的子项,然后运行具有 ssh-agent 支持的 gpg 代理,以便在运行时ssh something使用我的子项并使用 gpg 代理来询问密码?

理想情况下,我只为我的主 PGP 密钥提供一次 passhprase,然后每当我通过 ssh 提交或登录时,它都会使用正确的密码。

是否可以? (我知道它们的格式不同,但这就是我所知道的全部)

答案1

您需要的一切:

export GPG_TTY=$(tty)
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
ssh-add -c -t 3600 ~/.ssh/id_rsa   # set the cache lifetime as 3600s

然后随意删除文件:mv ~/.ssh/id_rsa.* /path/to/backup

现在您可以进行 SSH 登录进行测试。

毕竟,请记住将环境添加到您的个人资料中,例如.profile~/.bashrc


(PS:您可以发现ssh密钥(gpg格式)存在于keygrip中,~/.gnupg/private-keys-v1.d/并且其名称为keygrip,可以将其添加为子密钥。

参考:

https://incenp.org/notes/2015/gnupg-for-ssh-authentication.html

https://www.gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html

答案2

找到了一个简单的方法。您需要pem2openpgp来自 Monkeysphere 项目的实用程序以及gpg2将现有密钥导入为子密钥的能力。

首先将 SSH 密钥转换为 OpenPGP 格式。您必须按照 GPG 的要求提供新的用户 ID。

$ pem2openpgp $TEMP_USERID < .ssh/id_rsa | gpg2 --import

现在您有了一个新的用户 ID,并且您的 SSH 密钥作为主密钥。您可以使用gpg2 -K(我设置TEMP_USERIDTEST)来检查它。还记下新导入的密钥的 keygrip:

$ gpg2 -K --with-keygrip $TEMP_USERID
sec   rsa4096 2018-03-02 [C]
      21C766CAC691F395D640E8207E9F9F883D1E49D8
      Keygrip = AAB27E63622E87B27AC34293EDF52C3AB016CA2E
uid           [ unknown] TEST

现在使用gpg2 --expert --edit-key您的主密钥并将上面的密钥导入为您的子密钥:

$ gpg2 --expert --edit-key $YOURUSERID
gpg> addkey
......
(13) Existing key
Enter the keygrip: AAB27E63622E87B27AC34293EDF52C3AB016CA2E
......

gpg2会像往常一样问你很多问题。请记住切换正确的密钥功能(签名:关闭、加密:关闭、验证:打开)。

此后,您应该将导入的 SSH 密钥作为主密钥的子密钥。核实:

$ gpg2 -K $YOURUSERID --with-keygrip
sec   rsa4096 2016-02-02 [SC]
......
uid           [ 绝对 ] CUI Hao (cvhc) <[email protected]>
......
ssb   rsa4096 2018-02-21 [A]
      Keygrip = AAB27E63622E87B27AC34293EDF52C3AB016CA2E

您可以用来gpg2 --export-ssh-key验证导入的子密钥确实与原始 SSH 密钥相同。

请注意,用于密钥导入的临时用户 ID 仍在您的密钥环中。您必须手动删除它。 GnuPG 阻止您在不删除相应私钥的情况下删除公钥/用户 ID。但是,由于临时用户和您导入的子项共享相同的私钥,gpg2 --delete-secret-keys $TEMP_USERID因此也会删除导入的子项。

我的解决方案是备份私钥~/.gnupg/private-keys-v1.d并在删除导入的子密钥后将其移回gpg2

我提交了一个功能请求,要求 GnuPG 提供删除公钥而不影响私钥的选项:https://dev.gnupg.org/T3808

相关内容