使用gpg-agent-connect工具重建ssh私钥文件


8

~/.ssh/id_dsa由于忘记了密码,我无法访问我的文件(DSA算法中的OpenSSH私钥文件)。

但是,最初,我已经将它导入gpg-agentgpg-agent密码并用gpg-agent密码保护了,我确实知道。而且gpg-agent即使现在我仍然希望使用存储在中的内容重建OpenSSH私钥文件,私钥仍然可以正常工作gpg-agent

使用gpg-connect-agent工具,通过以下命令序列,尽管我不知道如何将其重构为原始的OpenSSH私钥文件格式,但我认为它能够提取私钥(十六进制/ ascii格式):

  1. 开始gpg-connect-agent--hex选项。
  2. >提示符下,使用keyinfo --ssh-list命令获取密钥的十六进制ID (确切地说,这是提供密钥十六进制ID的第三个字段)。
  3. >提示符下,执行keywrap_key --export
  4. >提示符下,执行export_key <enter hex ID from step 2>export_key --openpgp <enter hex ID from step 2>

现在,在提示输入密码短语,接收并确认密码之后,该gpg-connect-agent工具将显示几十行十六进制和ASCII码,我高度怀疑这是我最初导入的ssh私钥。

然后,它显示OK,肯定表示操作成功。

假设显示的确实是我的ssh私钥(按照“ help export_key”,转储到屏幕上的是密钥的aeswrap-128加密版本;很可能是用我已知的gpg-agent密码加密的),有关如何使用将信息转换为传统的ssh私钥格式将不胜感激(使用perl / python / shell / C程序将是一个加分项!)。

Answers:


1

希望能提供帮助,但是我有点没意思,因为我在遇到一个无关的问题时偶然发现了这个问题。在gpg 2.1.6-> 2.1.10升级期间,我遇到了Ed25519私钥解析问题:https ://bugs.gnupg.org/gnupg/issue2096 。我写的脚本有些刺耳,它可以转储不受保护的S表达式密钥,我可以对其进行十六进制编辑和重新加密。

因此,关于这个问题,我编写了一个Python脚本(https://gist.github.com/zougloub/3058d56857ba400b7ec3),该脚本使用gpg-agent通过检索libassuan转义的keywrap密钥来提取不受保护的S表达式SSH私钥。 ,加密密钥并解密(使用libgcrypt)。它不会完全回答您的问题,因为它不会以SSH格式转储数据。

希望您能进一步做到这一点,因为数据现在至少处于可分析状态。

其他指针:

  • libgcrypt有一个s-expression解析库和一些文档:https ://www.gnupg.org/documentation/manuals/gcrypt/Used-S_002dexpressions.html#Used-S_002dexpressions

  • GPG具有C代码等sexp_key_extractssh_send_key_publicssh_handler_request_identities

我很好奇我是否可以再加倍努力,但是我已经花了太多的时间在四处闲逛……有人理智地会重新生成SSH密钥:D

问候,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.