我为 SSL 证书创建了一个 RSA 密钥对,并将私钥存储在 中/etc/ssl/private/server.key
。不幸的是,这是我拥有的私钥的唯一副本。
然后我不小心覆盖了磁盘上的文件(是的,我知道)。
Apache 仍在运行,并且仍在处理 SSL 请求,这让我相信可能还有希望恢复私钥。(也许某处有符号链接/proc
?)
该服务器正在运行 Ubuntu 12.04 LTS。
答案1
成功!
我能够检索私钥。但这并不容易。您需要执行以下操作:
- 制作当然您不会重新启动服务器或 Apache。此时游戏就结束了。这也意味着确保没有监控服务重新启动 Apache。
- 抓住这个文件- 源代码名为 passe-partout 的工具。
提取源代码并调整第 9 行
Makefile.main
如下:$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
(请注意,
$(OBJS)
和的$(LDFLAGS)
顺序是相反的。)- 跑步
./build.sh
。 使用以下命令获取 Apache 的 PID:
service apache2 status
以 root身份运行
passe-partout
命令:sudo passe-partout [PID]
...
[PID]
您在步骤 #5 中检索到的值在哪里。如果程序成功运行,你当前的目录将会有一堆额外的键:
you@server:~# ls id_rsa-0.key id_rsa-1.key id_rsa-2.key
如果一切顺利(希望如此),其中一个密钥就是您需要的。但是,如果您使用了多个证书/密钥文件,则需要确定是哪一个。操作方法如下:
首先获取与签名密钥匹配的证书副本。假设文件名为server.crt
,运行以下命令:
openssl x509 -noout -modulus -in server.crt | openssl md5
这将输出您需要与每个键匹配的值。对于每个键,运行以下命令:
openssl rsa -noout -modulus -in id_rsa-0.key | openssl md5
如果其中一个匹配,则说明您找到了钥匙。
信用: 本文向我指出了路路通。
答案2
最有可能的是,它将密钥存储在内存中,这样做是因为它需要在放弃权限和/或使用提供的密码解密密钥后保留一份副本。
理论上,如果您连接了调试器,您就可以将其从进程映像中取出,但如果他们遵循最佳实践,它将根据内存中的某些内容进行加密。
也就是说,如果它仍然打开,那么/proc/${PID}/fd/${SOMETHING}
可能是它。如果你覆盖了它,你的密钥将不在那里,因为覆盖数据将在那里。如果你将其他内容复制到它的位置(或删除或取消链接它,或递归删除它的父目录),它将在那里。