从正在运行的Apache实例中检索RSA密钥?

我为SSL证书创build了一个RSA密钥对,并将私钥存储在/etc/ssl/private/server.key 。 不幸的是,这是我拥有的唯一私钥。

然后我不小心覆盖了磁盘上的文件(是的,我知道)。

Apache仍在运行,仍在服务于SSL请求,这让我相信恢复私钥有希望。 (也许在/proc或某个地方有一个符号链接?)

该服务器运行Ubuntu 12.04 LTS。

成功!

我能够检索私钥。 但这并不容易。 这是你需要做的:

  1. 确保你没有重启服务器或Apache。 那场比赛已经结束了。 这也意味着确保没有监控服务重新启动Apache。
  2. 抓取这个文件 – 一个名为passe-partout的工具的源代码。
  3. 提取源代码并调整Makefile.main第9行以读取:

     $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) 

    (请注意, $(OBJS)$(LDFLAGS)的顺序相反。)

  4. 运行./build.sh
  5. 使用以下方法获取Apache的PID:

     service apache2 status 
  6. 以root身份运行passe-partout命令:

     sudo passe-partout [PID] 

    …其中[PID]是您在步骤#5中检索的值。

  7. 如果程序成功,你的当前目录将有一堆额外的键:

     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删除其父目录),它将在那里。