Получение ключа RSA из запущенного экземпляра Apache?
26
Я создал пару ключей RSA для сертификата SSL и сохранил закрытый ключ /etc/ssl/private/server.key. К сожалению, это была единственная копия закрытого ключа, которая у меня была.
Тогда я случайно перезаписал файл на диске (да, я знаю).
Apache все еще работает и все еще обслуживает запросы SSL, что наводит меня на мысль, что может быть надежда на восстановление закрытого ключа. (Возможно, где-то есть символическая ссылка /procили что- то в этом роде?)
Этот сервер работает под управлением Ubuntu 12.04 LTS.
Мне удалось получить закрытый ключ. Но это было нелегко. Вот что вам нужно сделать:
Убедитесь, что вы не перезагружаете сервер или Apache. На этом игра окончена. Это также означает, что никакие сервисы мониторинга не перезапускают Apache.
Извлеките исходный код и настройте строку 9, Makefile.mainчтобы читать:
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
(Обратите внимание, что $(OBJS)и $(LDFLAGS)в обратном порядке.)
Беги ./build.sh.
Получите PID Apache, используя:
service apache2 status
Запустите passe-partoutкоманду от имени пользователя root:
sudo passe-partout [PID]
... где [PID]это значение, которое вы получили на шаге № 5.
Если программа завершится успешно, ваш текущий каталог будет содержать несколько дополнительных ключей:
you@server:~# ls
id_rsa-0.key id_rsa-1.key id_rsa-2.key
Если все прошло хорошо (и, надеюсь, все получилось), вам нужен один из этих ключей. Однако, если вы использовали более одного сертификата / ключевого файла, вам нужно выяснить, какой это. Вот как вы это делаете:
Сначала возьмите копию сертификата, соответствующего подписанному ключу. Предполагая, что файл назван server.crt, выполните следующую команду:
+1 за рецензию (и виртуальный +1 за автора статьи: стыдно и по-прежнему записывать его помогает другим в этой ситуации).
Йоахим Зауэр
2
О, это невероятно и так грязно. Я люблю это.
Том О'Коннор
8
Скорее всего, он хранит ключ в памяти, что он и делает, потому что ему нужно сохранить копию после того, как он отбросит привилегии и / или расшифрует ключ, используя предоставленную ключевую фразу.
Теоретически вы можете извлечь его из образа процесса, если подключите отладчик, хотя, если они следуют передовым методам, он будет зашифрован против чего-то в памяти.
Тем не менее, если это произойдет, что он все еще открыт, /proc/${PID}/fd/${SOMETHING}может быть. Если вы перезаписали его, ваш ключ не будет там, потому что будут перезаписаны данные. Если вы скопировали что-то еще на его место (или удалили или отменили связь с ним, или рекурсивно удалили его родительский каталог), оно будет там.
Я использовал, cpчтобы скопировать новый ключ вместо старого.
Натан Осман
Я просмотрел дескрипторы открытых файлов в /proc... ничего.
Натан Осман
Вероятно, тогда он не оставлял копию открытой, что является обычным случаем чтения секретных ключей; Ваши единственные варианты - выяснить, как и где он хранится из источника, извлечь его с помощью отладчика (при условии, что вы создали символы) и расшифровать его ... или заменить сертификат.
Сокол Момот
Я понял! Вы были правы - Apache хранит ключи в памяти, и я смог их восстановить. Пожалуйста, посмотрите мой ответ.
Скорее всего, он хранит ключ в памяти, что он и делает, потому что ему нужно сохранить копию после того, как он отбросит привилегии и / или расшифрует ключ, используя предоставленную ключевую фразу.
Теоретически вы можете извлечь его из образа процесса, если подключите отладчик, хотя, если они следуют передовым методам, он будет зашифрован против чего-то в памяти.
Тем не менее, если это произойдет, что он все еще открыт,
/proc/${PID}/fd/${SOMETHING}
может быть. Если вы перезаписали его, ваш ключ не будет там, потому что будут перезаписаны данные. Если вы скопировали что-то еще на его место (или удалили или отменили связь с ним, или рекурсивно удалили его родительский каталог), оно будет там.источник
cp
чтобы скопировать новый ключ вместо старого./proc
... ничего.