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

Nat*_*man 26 disaster-recovery ssl apache-2.2

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

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

Apache 仍在运行并且仍在处理 SSL 请求,这让我相信可能有希望恢复私钥。(也许在某处/proc或某处有一个符号链接?)

该服务器运行的是 Ubuntu 12.04 LTS。

Nat*_*man 39

成功!

我能够检索私钥。但这并不容易。您需要执行以下操作:

  1. 制作确保你不重新启动服务器或Apache。游戏到此结束。这也意味着确保没有监控服务重启 Apache。
  2. 获取此文件-名为 passe-partout 的工具的源代码。
  3. 提取源代码并调整第 9 行为Makefile.main

    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
    
    Run Code Online (Sandbox Code Playgroud)

    (注意$(OBJS)$(LDFLAGS)的顺序颠倒了。)

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

    service apache2 status
    
    Run Code Online (Sandbox Code Playgroud)
  6. passe-partout以 root 身份运行命令:

    sudo passe-partout [PID]
    
    Run Code Online (Sandbox Code Playgroud)

    ...[PID]您在第 5 步中检索到的值在哪里。

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

    you@server:~# ls
    id_rsa-0.key  id_rsa-1.key  id_rsa-2.key
    
    Run Code Online (Sandbox Code Playgroud)

如果一切顺利(希望一切顺利),那么这些钥匙之一就是您所需要的。但是,如果您有多个证书/密钥文件在使用,那么您需要弄清楚它是哪一个。这是你如何做到的:

首先获取与签名密钥匹配的证书副本。假设文件名为server.crt,请运行以下命令:

openssl x509 -noout -modulus -in server.crt | openssl md5
Run Code Online (Sandbox Code Playgroud)

这将输出一个您需要与每个键匹配的值。对于每个键,运行以下命令:

openssl rsa -noout -modulus -in id_rsa-0.key | openssl md5
Run Code Online (Sandbox Code Playgroud)

如果其中之一匹配,您就找到了钥匙。


信用: 这篇文章向我指出了passe-partout。

  • 文章+1(以及文章作者的虚拟+1:感到羞耻并仍然将其写下来可以帮助其他人在这种情况下)。 (3认同)
  • 很好地找到了该实用程序。 (2认同)
  • 哦,太棒了,太脏了。我喜欢它。 (2认同)

Fal*_*mot 8

它很可能将密钥存储在内存中,这样做是因为它需要在使用提供的密码删除特权和/或解密密钥后保留副本。

理论上,如果您附加了调试器,您可以将其从进程映像中取出,但如果他们遵循最佳实践,它将针对内存中的某些内容进行加密。

也就是说,如果碰巧它仍然打开,/proc/${PID}/fd/${SOMETHING}可能就是它。如果您覆盖它,您的密钥将不存在,因为覆盖数据将存在。如果您将其他内容复制到其位置(或删除或取消链接,或递归删除其父目录),它将在那里。