SSL証明書の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
_
すべてがうまくいけば(うまくいけばうまくいくなら)、それらのキーの1つが必要なキーです。ただし、複数の証明書/キーファイルを使用している場合は、それがどれであるかを把握する必要があります。その方法は次のとおりです。
最初に、署名されたキーと一致する証明書のコピーを取得します。ファイルの名前が_server.crt
_であると想定して、次のコマンドを実行します。
_openssl x509 -noout -modulus -in server.crt | openssl md5
_
これにより、各キーと照合する必要がある値が出力されます。キーごとに、次のコマンドを実行します。
_openssl rsa -noout -modulus -in id_rsa-0.key | openssl md5
_
それらの1つが一致する場合は、キーが見つかります。
クレジット:この記事 は私にpasse-partoutを指摘しました。
最も可能性が高いのは、キーをメモリに格納することです。これは、特権を削除したり、提供されたパスフレーズを使用してキーを復号化したりした後にコピーを保持する必要があるためです。
理論的には、デバッガーを接続した場合、プロセスイメージから取得できますが、ベストプラクティスに従っている場合は、メモリ内の何かに対して暗号化されます。
とは言っても、まだ開いている場合は、/proc/${PID}/fd/${SOMETHING}
多分それ。上書きした場合、データが上書きされるため、キーは存在しません。他の何かをその場所にコピーした場合(または削除またはリンク解除した場合、またはその親ディレクトリを再帰的に削除した場合)は、そこに存在します。