我最近创建了一个 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_USERID
为TEST
)来检查它。还记下新导入的密钥的 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