Назад | Перейти на главную страницу

Обнаружение незашифрованных ключей SSL

У меня установлен сервер OpenVPN на машине Debian.

Есть ли способ узнать, какой из ключей был создан без шифрования паролем, чтобы заменить их?

Вы можете использовать openssl rsa команда, чтобы определить, был ли ключ зашифрован паролем или нет:

if ! openssl pkey -passin pass:"" -in $keyfile > /dev/null 2>&1; then
  echo "$keyfile is encrypted."
fi

Это пытается расшифровать файл с пустой парольной фразой, которая отлично работает с незашифрованными ключами, но в противном случае потерпит неудачу. См. Раздел «ФРАЗОВЫЕ АРГУМЕНТЫ» openssl(1) справочную страницу для получения дополнительной информации об аргументах -passin вариант.

OpenVPN использует SSL / TLS для своей безопасности, поэтому он использует сертификаты и ключи SSL (поэтому ваш вопрос на самом деле не имеет ничего общего с OpenVPN). OpenVPN использует OpenSSL для работы (почти) со всеми вопросами безопасности, и его --key вариант (просто key в файлах конфигурации) ожидает, что ключ будет храниться в так называемом PEM формат (см. этот для общего обзора; сам формат определен в RFC 1421). Зашифрованные ключи хранятся в PEM формат отличается от незашифрованного тем, что имеет набор специальных полей заголовка, определяющих факт шифрования и используемый алгоритм шифрования - здесь пример.

Итак, строго говоря, вы должны обрабатывать каждый ключевой файл с помощью сценария, который попытается выполнить некоторый минимальный объем синтаксического анализа: определить строку заголовка (которая ------- BEGIN ... вещь), а затем попробуйте посмотреть, есть ли признаки шифрования. Но это, возможно, слишком сложно для одноразового решения, поэтому мне больше всего нравится ответ @larsks - это грубая сила, но достаточно элегантный и простой. Поэтому мой ответ здесь для того, чтобы ввести вас в некоторый контекст.


Учтите, что странно, почему у вас ключи клиентов на сервере: серверу не нужны ни ключи клиентов, ни их сертификаты - все, что его интересует, - это доступ к этим битам информации:

  • Собственный сертификат и соответствующий ключ.
  • Сертификат центра сертификации, выдавшего сертификат сервера.
  • Так называемый список отзыва сертификатов (CRL), поддерживаемый этим CA.

Вся идея о том, что OpenVPN доверяет некоторым, но не всем клиентам, основана на том факте, что он пропускает только тех клиентов, которые предоставляют действительные сертификаты. выдается центром сертификации, которому доверяет сервер- в большинстве случаев это тот же СА, который также выдал сертификат сервера. Однако есть способы ограничить это:

  • Отзыв сертификата клиента.
  • Настройка OpenVPN таким образом, чтобы он пропускал только клиентов, у которых есть свои специальные файлы конфигурации для каждого клиента (так называемые «файлы ccd», имена которых совпадают с именами субъектов сертификатов соответствующих клиентов).
  • Создание сценария обработки клиента openvpn для проверки информации о подключающемся клиенте и сбоя подключения в случае сбоя этой проверки.

Следовательно, нет необходимости хранить клиентские ключи на сервере: если клиент потерял свой сертификат и / или свой ключ, ваш центр сертификации должен отозвать его (обновить CRL) и выдать еще один. Таким образом, хранение общедоступных сертификатов клиентов может быть полезно (для более легкого отзыва), но даже это не требуется.

Для ключей без пароля фактический ключ обычно начинается со второй строки, а для ключей с паролем вы также можете найти три дополнительных строки.

Вы можете сделать что-то вроде wc -l /etc/openvpn/easy-rsa/keys/*.key а ключи с меньшим количеством строк не имеют пароля.

Удаление ключей ничего не делает в OpenVPN, и пользователи по-прежнему смогут подключаться со своим сертификатом и ключом. Вам необходимо отозвать сертификат пользователя, которому вы хотите запретить подключение.