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

Fra*_*nna 7 ssh gpg

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

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

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

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

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

Kin*_*Way 7

您需要的一切:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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


(Ps:你可以找到ssh key(gpg格式)存在~/.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


小智 6

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

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

$ pem2openpgp $TEMP_USERID < .ssh/id_rsa | gpg2 --import
Run Code Online (Sandbox Code Playgroud)

现在您有了一个新的用户 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

$ gpg2 -K $YOURUSERID --with-keygrip
sec   rsa4096 2016-02-02 [SC]
......
uid           [ ?? ] CUI Hao (cvhc) <cuihao.leo@gmail.com>
......
ssb   rsa4096 2018-02-21 [A]
      Keygrip = AAB27E63622E87B27AC34293EDF52C3AB016CA2E
Run Code Online (Sandbox Code Playgroud)

您可以使用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