我为 SSL 证书创建了一个 RSA 密钥对,并将私钥存储在/etc/ssl/private/server.key
. 不幸的是,这是我拥有的唯一私钥副本。
然后我不小心覆盖了磁盘上的文件(是的,我知道)。
Apache 仍在运行并仍在为 SSL 请求提供服务,这让我相信恢复私钥可能会有希望。(也许在某处或某处有符号链接/proc
?)
此服务器正在运行 Ubuntu 12.04 LTS。
我为 SSL 证书创建了一个 RSA 密钥对,并将私钥存储在/etc/ssl/private/server.key
. 不幸的是,这是我拥有的唯一私钥副本。
然后我不小心覆盖了磁盘上的文件(是的,我知道)。
Apache 仍在运行并仍在为 SSL 请求提供服务,这让我相信恢复私钥可能会有希望。(也许在某处或某处有符号链接/proc
?)
此服务器正在运行 Ubuntu 12.04 LTS。
成功!
我能够检索私钥。但这并不容易。这是您需要做的:
提取源代码并调整第9行为
Makefile.main
:(注意
$(OBJS)
and$(LDFLAGS)
的顺序颠倒了。)./build.sh
。使用以下命令获取 Apache 的 PID:
以 root 身份运行
passe-partout
命令:...
[PID]
您在第 5 步中检索到的值在哪里。如果程序成功,您的当前目录将有一堆额外的键:
如果一切顺利(希望它成功了),那么其中一把钥匙就是您需要的钥匙。但是,如果您使用了多个证书/密钥文件,那么您需要弄清楚它是哪一个。这是你如何做到的:
首先获取与签名密钥匹配的证书副本。假设文件名为
server.crt
,请运行以下命令:这将输出一个您需要与每个键匹配的值。对于每个键,运行以下命令:
如果其中之一匹配,则您已找到密钥。
信用: 这篇文章让我想到了passe-partout。
很可能它将密钥存储在内存中,因为它需要在放弃特权和/或使用提供的密码解密密钥后保留一份副本。
从理论上讲,如果您附加了一个调试器,您可以将其从进程映像中取出,但如果他们遵循最佳实践,它将针对内存中的某些内容进行加密。
也就是说,如果碰巧它仍然打开,
/proc/${PID}/fd/${SOMETHING}
可能就是这样。如果您覆盖它,您的密钥将不存在,因为覆盖数据将存在。如果您将其他内容复制到其位置(或删除或取消链接,或递归删除其父目录),它将在那里。