Разворачиваем собственный PKI

Многие считают, что развёртывание собственной инфраструктуры публичных ключей (PKI, удостоверяющего центра) — это очень сложно. В данной статье мы подробно разберём этот вопрос.

Введение

Ранее в статье про OpenVPN сервер мы уже разбирали вопрос создания PKI при помощи консольной утилиты easy-rsa, но для многих этот процесс показался достаточно сложным и весьма неудобным, поэтому сегодня мы рассмотрим утилиту с графическим интерфейсом пользователя — XCA.

Установка и запуск XCA

Установим утилиту XCA из репозиториев дистрибутива GNU/Linux любым удобным способом, а под Windows скачаем из раздела релизов.

Запустим её ярлыком из меню приложений и увидим главное окно.

Главное окно XCA
Главное окно XCA

Если при запуске будут выданы какие-либо сообщения об ошибках, просто проигнорируем их. На работу программы в целом они никак не влияют.

Создание проекта PKI

Сначала создадим проект PKI, т.е. базу данных, в которой будут храниться все сертификаты и ключи. Для этого в меню Файл выберем пункт New DataBase.

Укажем имя файла на диске для сохранения базы, после чего зададим максимально сложный пароль, которым она будет зашифрована (алгоритм AES-256).

Шифрование базы XCA
Шифрование базы XCA

Внимание! К выбору пароля следует отнестись с особой ответственностью, т.к. если злоумышленник сможет похитить файл проекта (базу данных) и подобрать к ней пароль, вся инфраструктура публичных ключей будет считаться скомпрометированной, т.к. закрытые ключи хранятся без отдельного шифрования.

Подтвердим действие и программа успешно создаст и загрузит проект. Все ранее недоступные кнопки и действия с этого момента будут разрешены.

Создание корневого сертификата

Мы успешно создали проект, загрузили его в программу и теперь должны сгенерировать корневой сертификат, которым будут подписаны создаваемые нами сертификаты, а также CSR (запросы на получение сертификатов).

Окно XCA с загруженным проектом
Окно XCA с загруженным проектом

В главном окне программы на странице Сертификаты нажмём кнопку Новый сертификат.

Создание УЦ средствами XCA
Создание УЦ средствами XCA

Для корневого сертификата в разделе Шаблон для нового сертификата выберем [default] CA, после чего нажмём Применить всё, чтобы задействовать его для всех доступных полей субъекта и расширений.

Установим точку около Создать самозаверенный сертификат, а также выберем в качестве алгоритма подписи SHA-256.

Создание субъекта сертификата
Создание субъекта сертификата

Перейдём на вкладку Субъект, укажем Internal Name (внутреннее имя в базе данных программы) и заполним требуемые поля (они будут применяться и для выпуска обычных сертификатов, а также запросов на их получение):

  • countryName — двухбуквенный код страны по стандарту ISO 3166-1, в которой расположена компания-владелец УЦ;
  • stateOrProvinceName — регион (область);
  • localityName — город;
  • organizationName — полное название организации;
  • organizationUnitName — название подразделения внутри организации, для которого выпускается сертификат;
  • commonName — название сертификата или имя сервиса, для которого выпускается сертификат;
  • emailAddress — адрес электронной почты владельца сертификата (для корневого — главный адрес организации).

Допускается добавить и другие необязательные поля если они необходимы:

  • streetAddress — адрес организации;
  • postalCode — почтовый индекс;
  • другие из списка.

Создадим закрытый ключ для данного сертификата нажатием на кнопку Сгенерировать новый ключ.

Создание закрытого ключа
Создание закрытого ключа

В поле Тип ключа укажем либо RSA (традиционные ключи), либо EC (на базе эллиптических кривых). Для RSA в Длина ключа установим значение не ниже 2048 бит (рекомендуется 4096 бит).

Нажмём кнопку Создать, после чего он появится в списке, на вкладке Субъект.

Перейдём на страницу Расширения.

Настройка параметров сертификата
Настройка параметров сертификата

Для корневого сертификата в поле Тип выберем Центр Сертификации, а также укажем его период действия минимум 10 лет (допускаются также варианты в 20 и 25 лет).

Также зададим точку распространения базы отозванных сертификатов (CRL). Для этого справа от X509v3 CRL Distribution Points нажмём Редактировать и укажем один или несколько URI, откуда данная база может быть оперативно получена. Следует отнестись серьёзно к указанию адресов здесь ибо они уже никогда не смогут быть изменены.

Параметры на всех остальных страницах мы менять не будем, после чего нажмём OK.

Окно XCA с созданным корневым сертификатом
Окно XCA с созданным корневым сертификатом

Если всё сделано верно, то в списке появится новый сертификат. Выберем его и нажмём Показать сведения, либо просто дважды кликнем по строке.

Просмотр сведений о сертификате
Просмотр сведений о сертификате

Создание базы отозванных сертификатов

Для завершения создания PKI мы должны сгенерировать и экспортировать базу отозванных сертификатов (CRL) по указанному ранее URI.

Нажмём правой кнопкой по корневому сертификату УЦ, затем выберем в контекстом меню пункт ЦССгенерировать CRL.

Создание базы отозванных сертификатов
Создание базы отозванных сертификатов

Укажем срок жизни CRL (в нашем примере это 6 месяцев) и если это единственный CRL, уберём флажок около чекбокса Порядковый номер CRL. Нажмём OK.

Созданный список отзыва появится на одноимённой странице и его можно экспортировать на веб-сервер.

Выпуск сертификатов

И хотя сертификаты можно создавать и напрямую со страницы Сертификаты, мы настоятельно не рекомендуем так делать ибо это противоречит всей идее публичной инфраструктуры ключей и созданные таким способом сертификаты для конечных пользователей следует заранее считать скомпрометированными, т.к. их закрытый ключ присутствует у кого-то ещё (в данном случае — у УЦ).

Вместо этого необходимо использовать функцию Запрос на получение сертификата. Это безопасный и надёжный способ как для пользователей, так и для самого удостоверяющего центра.

Каждый клиент создаёт запрос на получение сертификата и локально генерирует закрытый ключ. Далее запрос экспортируется в файл кнопкой Экспорт и отправляется любым способом в удостоверяющий центр.

Администратор УЦ импортирует его с помощью Импорт, а затем может подписать, выдав действительный сертификат с обозначенным сроком действия. Результат экспортируется и отправляется клиенту.

Закрытый ключ при этом не покидает компьютер клиента и безопасно хранится в его хранилище.

Создание запроса на сертификат

Нажмём кнопку Новый запрос на странице Запросы на получение сертификата.

Создание запроса на получение сертификата
Создание запроса на получение сертификата

Здесь все действия практически идентичны тем, что мы выполняли ранее при создании корневого сертификата.

В поле Шаблон для нового сертификата выберем следующее:

  • [default] TLS_client — сертификат для конечного клиента;
  • [default] TLS_server — сертификат для сервера (веб-сервер, почтовый сервер, OpenVPN сервер и т.д.).

Не забудем нажать Применить всё, затем сразу же перейдём на страницу Субъект.

Субъект запроса на сертификат
Субъект запроса на сертификат

Заполним все необходимые поля и сгенерируем закрытый ключ. Всё это мы уже рассматривали ранее, поэтому не будем останавливаться и сразу перейдём на следующую вкладку.

Вкладка расширений для запроса на сертификат
Вкладка расширений для запроса на сертификат

Здесь убедимся, что в поле Тип выбран Конечный субъект.

Если создаётся сертификат не для клиента, а для сервера, нажмём Редактировать около X509v3 Subject Alternative Name и укажем DNS-имена, которые будут им использоваться.

Альтернативные имена
Альтернативные имена

Здесь же допускается по необходимости указать альтернативные адреса электронной почты, IP-адреса и т.д.

Нажмём кнопку OK.

Окно со списком запросов
Окно со списком запросов

Выберем свой запрос, затем нажмём кнопку Экспорт.

Экспорт запроса на сертификат
Экспорт запроса на сертификат

Используем Формат для экспортаPEM. Передадим полученный файл в УЦ любым доступным способом:

  • электронная почта;
  • загрузка через форму;
  • внешний накопитель данных.

Выпуск сертификата

Импортируем полученный от пользователя запрос на сертификат кнопкой Импорт, выберем его в списке на странице Запросы на получение сертификата, нажмём правой кнопкой и в контекстом меню выберем пункт Подписать.

Подпись запроса на сертификат
Подпись запроса на сертификат

Обязательно установим точку около Использовать этот сертификат для подписи и выберем наш корневой сертификат УЦ, в Алгоритм подписиSHA-256.

Теперь мы можем либо взять расширения из запроса на сертификат (флажок около Копировать расширения из запроса установлен), либо переопределить их из шаблона (флажок, соответственно, должен быть снят, плюс указан иной шаблон в Шаблон для нового сертификата (при этом следует нажимать только кнопку Применить расширения)).

Переопределение расширений сертификата
Переопределение расширений сертификата

Теперь на вкладке Расширения укажем срок действия сертификата. Всё остальное можно не менять.

Просмотр подписанного сертификата
Просмотр подписанного сертификата

Нажмём OK и сертификат будет успешно подписан нашим УЦ. Экспортируем его в главном окне программы на странице Сертификаты и отправим клиенту.

Отзыв сертификатов

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

Выделим нужный сертификат в списке на странице Сертификаты, нажмём правой кнопкой и в контекстном меню выберем пункт Отозвать.

Отзыв сертификата
Отзыв сертификата

Укажем причину отзыва и подтвердим данное действие.

После каждого отзыва повторим действия, указанные ранее в Создание базы отозванных сертификатов.