我为SSL证书创build了一个RSA密钥对,并将私钥存储在/etc/ssl/private/server.key
。 不幸的是,这是我拥有的唯一私钥。
然后我不小心覆盖了磁盘上的文件(是的,我知道)。
Apache仍在运行,仍在服务于SSL请求,这让我相信恢复私钥有希望。 (也许在/proc
或某个地方有一个符号链接?)
该服务器运行Ubuntu 12.04 LTS。
我能够检索私钥。 但这并不容易。 这是你需要做的:
提取源代码并调整Makefile.main
第9行以读取:
$(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
如果其中一个匹配,你find了钥匙。
信用: 这篇文章指出了我的观点。
它最有可能将密钥存储在内存中,因为它需要在丢弃权限之后保留副本,和/或使用提供的密码解密密钥。
从理论上讲,如果你连接了一个debugging器,你可以把它从stream程映像中取出来,但是如果他们遵循最佳实践,它将被encryption以抵御内存中的某些事情。
也就是说,如果碰巧它还是打开的话,可能是/proc/${PID}/fd/${SOMETHING}
。 如果你覆盖它,你的密钥将不会在那里,因为覆盖数据将是。 如果你复制了其他东西(或删除或取消链接,或recursion删除其父目录),它将在那里。