我为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。
Answers:
我能够检索到私钥。但这并不容易。这是您需要做的:
提取源代码并调整第9行Makefile.main
以读取:
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
(请注意,$(OBJS)
和$(LDFLAGS)
的顺序相反。)
./build.sh
。使用以下命令获取Apache的PID:
service apache2 status
以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
如果其中之一匹配,则说明已找到密钥。
信用: 这篇文章指出我要过路。
它最有可能将密钥存储在内存中,因为它需要在删除特权和/或使用提供的密码短语对密钥进行解密后保留副本,因此需要这样做。
从理论上讲,如果您连接了调试器,则可以将其从过程映像中删除,尽管如果调试器遵循最佳实践,则会针对内存中的内容对其进行加密。
就是说,如果碰巧它仍然保持打开状态,/proc/${PID}/fd/${SOMETHING}
也许就是这样。如果覆盖了它,则密钥将不存在,因为将覆盖数据。如果将其他内容复制到其位置(或删除或取消链接,或递归删除其父目录),则该目录将在那里。
cp
复制新密钥代替旧密钥。
/proc
…… 的打开文件描述符。