Отримання ключа RSA з запущеного примірника Apache?


26

Я створив ключ RSA для сертифіката SSL і зберігав приватний ключ у /etc/ssl/private/server.key. На жаль, це була єдина копія приватного ключа, яку я мав.

Потім я випадково перезаписав файл на диску (так, я знаю).

Apache все ще працює і все ще обслуговує SSL-запити, що призводить до того, що я маю надію відновити приватний ключ. (Можливо, десь є символічне посилання /procчи щось таке?)

На цьому сервері працює Ubuntu 12.04 LTS.

Відповіді:


39

УСПІХ!

Мені вдалося отримати приватний ключ. Але це було непросто. Ось що вам потрібно зробити:

  1. Переконайтеся, що ви не перезавантажуєте сервер або Apache. Гра закінчилася в цей момент. Це також означає переконатися, що жодні служби моніторингу не перезапускають Apache.
  2. Візьміть цей файл - вихідний код інструменту з назвою pass-partout .
  3. Витягніть вихідний код і відрегулюйте рядок 9 Makefile.mainдля читання:

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

    (Зауважте, що $(OBJS)і $(LDFLAGS)перетворено порядок.)

  4. Біжи ./build.sh.
  5. Візьміть PID Apache за допомогою:

    service apache2 status
    
  6. Запустіть 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

Якщо одна з них відповідає, ви знайшли ключ.


Кредит: ця стаття вказувала мені на прохід.


2
Добре знайти цю утиліту.
Falcon Momot

3
+1 для написання (і віртуальна +1 для автора статті: соромно і все-таки записати це допомагає іншим у цій ситуації).
Йоахім Зауер

2
О, це казково, і так брудно. Я це люблю.
Том О'Коннор

8

Швидше за все, це зберігання ключа в пам'яті, що він робить, тому що йому потрібно зберегти копію після того, як вона скасує привілеї та / або розшифрує ключ за допомогою доданої парольної фрази.

Теоретично ви могли б вийти із зображення процесу, якщо ви додасте налагоджувач, хоча якщо вони дотримуються кращих практик, він буде зашифрований проти чогось у пам'яті.

Однак, якщо трапиться, що він все ще відкритий, це /proc/${PID}/fd/${SOMETHING}може бути. Якщо ви перезаписали його, ключ не буде там, оскільки дані будуть перезаписані. Якщо ви скопіювали щось інше на його місце (або видалили або від’єднали його, або рекурсивно видалили його батьківський каталог), воно буде там.


Я cpскопіював новий ключ замість старого.
Натан Осман

Я переглянув дескриптори відкритих файлів у /proc... нічого.
Натан Осман

Можливо, тоді копія не залишалася відкритою, що є звичайним випадком читання приватних ключів; Ваші єдині варіанти - з’ясувати, як і де він зберігається з джерела, витягнути його за допомогою налагоджувача (якщо припустити, що ви побудували з символами) та розшифрувати його ... або замінити сертифікат.
Falcon Momot

Зрозумів! Ви мали рацію - Apache зберігає ключі в пам'яті, і я зміг їх отримати. Будь ласка, дивіться мою відповідь.
Натан Осман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.