Собственная инфраструктура открытых ключей на базе EasyRSA

Собственная инфраструктура открытых ключей — штука неоднозначная. Будьте готовы к необходимости добавления корневого сертификата в операционную систему каждого подключаемого устройства, а также возможным проблемам с отдельными клиентами.

Ожидается, что читатель знает достаточно про TSL/SSL, в состоянии заполучить выделенный сервер с установленной операционной системой Ubuntu 18.04 LTS (для экспериментов используйте промо-код на сто долларов), а также владеет навыками ее администрирования.

Составляющие инфраструктуры

В основе инфраструктуры открытых ключей1 лежит криптографическая система с открытым ключом (например, RSA). На практике это означает, что каждому устройству (серверу, рабочей станции, смартфону) выдается ключ, который служит идентификатором.

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

Например, для доступа к VPN сотрудник использует именно сертификат, а не имя пользователя и пароль. При установлении соединения сервер и клиент проверяют подлинность сертификатов друг друга; если проверки завершены успешно — коммуникация продолжается.

Проверка подлинности, в основном, проводится по трем параметрам:

  1. сертификат должен быть подписан удостоверяющим центром2;
  2. сертификат должен иметь неистекший срок действия;
  3. сертификат не должен содержаться в специальном отзывном листе3, указывающем о явном его аннулировании.

Короче говоря, инфраструктура состоит из удостоверяющего центра и удостоверенных им сущностей.

Встречаются инфраструктуры с двумя и более удостоверяющими центрами, а также другими заморочками вроде OCSP.

Преимущества и недостатки

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

Однако, централизованность (даже при использовании нескольких центров) может оказаться проблемой. Например, список отозванных сертификатов при каждом обновлении необходимо обновлять на всех ответственных узлах.

К тому же, с реализацией отзыва есть существенные проблемы4.

Приготовления

В вашем распоряжении должен быть выделенный сервер с Ubuntu 18.04 — для настройки удостоверяющего центра. С его помощью вы сможете обрабатывать запросы на подписание сертификата5.

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

Соглашение

Чтобы придать инструкции большую осмысленность, сыграем в сетевого инженера компании Goldfinch. У нас есть домен goldfinch.im, сервер удостоверяющего центра имеет DNS-имя rca01.goldfinch.im и позволяет использовать систему от имени пользователя support с правами sudo.

Настройка удостоверяющего центра

С помощью SSH подключитесь к целевому серверу:

ssh support@rca01.goldfinch.im

Скачайте актуальную версию EasyRSA, распакуйте и переименуйте директорию во что-то осмысленное:

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 goldfinch
cd goldfinch

Создайте копию файла примера конфигурации:

cp vars.example vars

Конфигурирование EasyRSA

Прочитайте и проверьте файл vars до выполнения дальнейших действий. (Весьма полезными окажутся содержащиеся в нем комментарии.)

X.509 Distinguished Name

EASYRSA_DN — параметр, определяющий процедуру генерации сертификатов.

Свежие версии по умолчанию используют упрощенный формат cn_only (common name only), требующий ввода только универсального имени.

При использовании «классического» значения org (organization), генератор, помимо универсального имени, потребует указать дополнительные атрибуты: страну, регион, город, название организации и ее подразделения, а также адрес электронной почты.

Мы выберем «классический» вариант из-за большей наглядности результата. Переопределите значение:

set_var EASYRSA_DN "org"

Укажите значения следующих параметров (они будут использоваться по умолчанию при выпуске сертификатов):

set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "Goldfinch LLC"
set_var EASYRSA_REQ_EMAIL "noc@goldfinch.im"
set_var EASYRSA_REQ_OU "Network Operations Center"

Размер файлов ключей

Параметр EASYRSA_KEY_SIZE определяет размер генерируемых ключей. По умолчанию используется 2048 бит, чего во многих случаях достаточно.

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

set_var EASYRSA_KEY_SIZE 2048

Срок действия сертификатов

EASYRSA_CA_EXPIRE устанавливает срок действия ключа удостоверяющего центра (3650 дней), EASYRSA_CERT_EXPIRE — для остальных выпускаемых сертификатов (1080 дней).

set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 1080

Из-за ряда сложностей4 будет разумно сократить срок действия выпускаемых сертификатов до приемлемого минимума.

Инициализация инфраструктуры

./easyrsa init-pki

Генерация корневого сертификата удостоверяющего центра

./easyrsa build-ca nopass

Генератор попросит указать семь атрибутов для нового сертификата; для шести из них будет предложено значение по умолчанию. Остается придумать универсальное имя6. (Например, Goldfinch Trusted Network CA.)

Чтобы оставить значение какого-либо атрибута пустым используйте символ точки .

Обратите внимание, что в примере указан необязательный параметр nopass, благодаря которому EasyRSA не будет запрашивать пароль при каждом вызове.

Будут созданы сертификат pki/ca.crt и секретный ключ pki/private/ca.key.

Использование готовой инфраструктуры

В любой непонятной ситуации используйте подсказки EasyRSA. Посмотреть список поддерживаемых команд можно вызовом ./easyrsa help (информация по отдельно взятой команде — ./easyrsa help COMMAND).

Описание процесса

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

  1. заявитель составляет и отправляет запрос5 в центр сертификации по безопасному каналу (секретный ключ не раскрывается);
  2. удостоверяющий центр подписывает запрос, выпускает сертификат и возвращает его заявителю.

После выполнения этих простых шагов удостоверяющий центр знает о новом заявителе; тот, в свою очередь, имеет удостоверенный сертификат и секретный ключ для его использования.

Практикум

Самое время составить запрос на выдачу первого сертификата. Предположим, что у нашей компании есть подрядчик — организация Acme, сотрудники которой должны получить доступ в нашу сеть.

NB! Важная особенность

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

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

Инфраструктура открытых ключей Acme

Сетевому инженеру Acme предстоит выполнить уже известные шаги:

  1. настроить выделенный сервер;
  2. скачать EasyRSA;
  3. отредактировать конфигурационный файл;
  4. инициализировать инфраструктуру;
  5. сгенерировать корневой сертификат собственного удостоверяющего центра;
  6. сгенерировать запросы (по одному на каждого сотрудника, нуждающегося в доступе) на получение сертификата у компании—клиента.
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 acme
cd acme
cp vars.example vars

Параметры конфигурации Acme могут выглядеть следующим образом:

set_var EASYRSA_DN "org"

set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "Acme Inc."
set_var EASYRSA_REQ_EMAIL "noc@acme.com"
set_var EASYRSA_REQ_OU "Network Operations Center"

set_var EASYRSA_KEY_SIZE 2048

set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 1080

В качестве универсального имени для сертификата удостоверяющего центра можно использовать Acme Trusted Network CA.

./easyrsa init-pki
./easyrsa build-ca nopass

Со стороны Acme

Первым сотрудником Acme, который получит доступ к инфраструктуре Goldfinch, станет Алиса. Сетевой инженер Acme генерирует запрос от ее имени следующим образом:

./easyrsa gen-req alice nopass

Обратите внимание, что некоторые атрибуты (отдел, электронная почта) сертификата Алисы могут быть указаны вручную и отличаться от значений по умолчанию:

Country Name (2 letter code) [RU]:
State or Province Name (full name) [Moscow]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Acme Inc]:
Organizational Unit Name (eg, section) [Network Operations Center]:Marketing Department
Common Name (eg: your user, host, or server name) [alice]:Alice
Email Address [noc@acme.com]:alice@acme.com

Keypair and certificate request completed. Your files are:
req: ~/acme/pki/reqs/alice.req
key: ~/acme/pki/private/alice.key

После этого сетевой инженер Acme передает файл alice.req сетевому инженеру Goldfinch.

Со стороны Goldfinch

Сетевой инженер Goldfinch принял файл запроса. Прежде всего, он должен загрузить его на сервер удостоверяющего центра:

scp alice.req support@rca01.goldfinch.im:/tmp/alice.req

После выполнить на сервере удостоверяющего центра процедуру импорта и подписания:

./easyrsa import-req /tmp/alice.req alice

The request has been successfully imported with a short name of: alice
You may now use this name to perform signing operations on this request.
./easyrsa sign-req client alice

Request subject, to be signed as a client certificate for 3650 days:

subject=
    countryName               = RU
    stateOrProvinceName       = Moscow
    localityName              = Moscow
    organizationName          = Acme Inc
    organizationalUnitName    = Marketing Department
    commonName               = Alice
    emailAddress              = alice@acme.com


Type the word 'yes' to continue, or any other input to abort.

Запрос удовлетворен, был сгенерирован файл сертификата pki/issued/alice.crt. Сетевой инженер Goldfinch передает его коллеге из Acme, тот настраивает VPN-подключение на рабочем компьютере Алисы.

Профит.


  1. Public Key Infrastructure, PKI 

  2. Certification Authority, CA 

  3. Cerificate Revocation List, CRL 

  4. Scott Helme: Revocation is broken 

  5. Certificate Signing Request, CSR 

  6. Common Name, CN