web-dev-qa-db-ja.com

Apacheの実行中のインスタンスからRSAキーを取得しますか?

SSL証明書のRSAキーペアを作成し、秘密キーを/etc/ssl/private/server.keyに保存しました。残念ながら、これは私が持っていた秘密鍵の唯一のコピーでした。

次に、誤ってディスク上のファイルを上書きしました(はい、知っています)。

Apacheはまだ実行中で、SSLリクエストを処理しているので、秘密鍵を復元することに希望があるのではないかと思いました。 (おそらく、/procのどこかにシンボリックリンクがあるのでしょうか?)

このサーバーはUbuntu 12.04 LTSを実行しています。

26
Nathan Osman

成功!

秘密鍵を取得することができました。しかし、それは簡単ではありませんでした。これはあなたがする必要があることです:

  1. サーバーまたはApacheを再起動しないでください確認。その時点でゲームは終了です。これは、監視サービスがApacheを再起動しないことを確認することも意味します。
  2. Grab this file - 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
    _

すべてがうまくいけば(うまくいけばうまくいくなら)、それらのキーの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を指摘しました。

39
Nathan Osman

最も可能性が高いのは、キーをメモリに格納することです。これは、特権を削除したり、提供されたパスフレーズを使用してキーを復号化したりした後にコピーを保持する必要があるためです。

理論的には、デバッガーを接続した場合、プロセスイメージから取得できますが、ベストプラクティスに従っている場合は、メモリ内の何かに対して暗号化されます。

とは言っても、まだ開いている場合は、/proc/${PID}/fd/${SOMETHING} 多分それ。上書きした場合、データが上書きされるため、キーは存在しません。他の何かをその場所にコピーした場合(または削除またはリンク解除した場合、またはその親ディレクトリを再帰的に削除した場合)は、そこに存在します。

8
Falcon Momot