~/.ssh/id_dsa
由于忘记密码,我无法访问我的文件(DSA 算法中的 OpenSSH 私钥文件)。
但是,最初,我已将其导入gpg-agent
并使用我确实知道的 gpg-agent 密码短语进行保护。即使现在私钥仍然可以正常工作gpg-agent
,尽管我现在希望使用存储在gpg-agent
.
使用gpg-connect-agent
工具,通过以下命令序列,我认为能够提取私钥(十六进制/ascii 格式),尽管我不知道如何将其重建为原始 OpenSSH 私钥文件格式:
gpg-connect-agent
从--hex
选项开始。- 在
>
提示符中,使用命令获取密钥的十六进制 IDkeyinfo --ssh-list
(准确地说,它是提供密钥的十六进制 ID 的第三个字段)。 - 在
>
提示符下,执行keywrap_key --export
. - 在
>
提示符下,执行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 程序来做到这一点将是一个额外的好处!)。
答案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 密钥、加密密钥并解密(使用 libgcrypt)来提取未受保护的 S-表达式 SSH 私钥。它不能完全回答您的问题,因为它不会以 SSH 格式转储数据。
希望您能更进一步,因为数据现在至少处于可解析状态。
进一步指示:
libgcrypt 有一个 s-表达式解析库和一些文档:https://www.gnupg.org/documentation/manuals/gcrypt/Used-S_002dexpressions.html#Used-S_002dexpressions
gpg 有 C 代码,例如
sexp_key_extract
,ssh_send_key_public
,ssh_handler_request_identities
我很好奇我是否可以多做一些事情,但我已经浪费了太多的时间四处闲逛……理智的人会重新生成一个 SSH 密钥:D
问候,