Сегодня TLS используется повсеместно для безопасной передачи данных, и практически любой веб‑сайт работает по протоколу HTTPS. Но, кроме шифрования трафика, TLS позволяет реализовать аутентификацию клиентов по сертификату (mTLS). В этой статье мы настроим этот механизм на примере веб‑сервера Angie.

Навигация по циклу

  1. Почему стоит переходить на Angie.

  2. Установка Angie из пакетов и в докере.

  3. Переезд с Nginx на Angie. Пошаговая инструкция.

  4. Настройка location в Angie. Разделение динамических и статических запросов.

  5. Перенаправления в Angie: return, rewrite и примеры их применения.

  6. Сжатие текста в Angie: статика, динамика, производительность.

  7. Серверное кэширование в Angie: тонкости настройки.

  8. Настройка TLS в Angie: безопасность и скорость.

  9. Настройка Angie в роли обратного HTTP-прокси.

  10. Балансировка нагрузки для HTTP(S) в Angie.

  11. Мониторинг Angie с помощью Console Light и API.

  12. Балансировка и проксирование L4-трафика в Angie.

  13. Клиентское кэширование в Angie.

  14. Динамические группы проксируемых серверов в Angie.

  15. Мониторинг Angie с Prometheus и Grafana.

  16. Отказоустойчивый кластер Angie с VRRP и Keepalived.

  17. Контроль доступа в Angie.

  18. Аутентификация клиентов в Angie с помощью TLS-сертификатов.

Видеоверсия

Для вашего удобства подготовлена видеоверсия этой статьи, доступна на Rutube, VKVideo и YouTube.

Принцип работы mTLS

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

Сертификат представляет собой открытый ключ (public key) с подписью от удостоверяющего центра (также ЦС — центр сертификации, или CA — certificate authority). К каждому сертификату прилагается секретный ключ (private key).

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

В случае взаимного TLS (mTLS — mutual TLS authentication) клиент также должен представиться с помощью сертификата для того, чтобы получить доступ к ресурсам на сервере. В простом случае для получения доступа достаточно, чтобы клиентский сертификат был подписан удостоверяющим центром, которому доверяет сервер. Если при обычном подключении HTTPS‑клиент уже имеет список доверенных (корневых) удостоверяющих центров, то в mTLS сертификат доверенного центра указывается в конфигурации явно.

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

Подготовка сертификатов

Для создания клиентских сертификатов мы будем использовать проект EasyRSA, который позволяет легко создать собственный удостоверяющий центр и выписывать сертификаты. Начнём с установки пакета (в статье команды приведены на примере Ubuntu 24.04): 

apt install easy-rsa

Далее нам необходимо создать конфигурацию собственного удостоверяющего центра (будем использовать директорию /etc/angie/easy-rsa):

make-cadir /etc/angie/easy-rsa

Далее переходим в эту директорию и запускаем процесс инициализации CA:

cd /etc/angie/easy-rsa
./easyrsa init-pki
./easyrsa build-ca

В процессе настройки устанавливаем надёжный пароль (passphrase) для шифрования секретного ключа. Дополнительно можно внести изменения в конфигурационный файл (vars) для настройки свойств сертификатов. Значения, конечно же, приведены для примера и могут меняться:

echo 'set_var EASYRSA_DN "ROOTCA"' >> vars
echo 'set_var EASYRSA_KEY_SIZE 4096' >> vars
echo 'set_var EASYRSA_REQ_COUNTRY "RU"' >> vars
echo 'set_var EASYRSA_REQ_PROVINCE "Moscow"' >> vars
echo 'set_var EASYRSA_REQ_CITY "Moscow"' >> vars
echo 'set_var EASYRSA_REQ_ORG "IT Corp"' >> vars
echo 'set_var EASYRSA_REQ_OU "IT"' >> vars
echo 'set_var EASYRSA_REQ_EMAIL "test@test.ru"' >> vars

Теперь мы можем выписать комплект из сертификата и секретного ключа сервера

./easyrsa build-server-full server nopass

Полученную пару файлов копируем в директорию настроек TLS Angie (/etc/angie/ssl/). Обратите внимание, что название сертификата в предыдущей команде (server) фигурирует в пути к сертификату и ключу:

mkdir /etc/angie/ssl
cp /etc/angie/easy-rsa/pki/issued/server.crt /etc/angie/ssl
cp /etc/angie/easy-rsa/pki/private/server.key /etc/angie/ssl

На этом с серверной частью мы закончили. Осталось сгенерировать сертификат и ключ для клиента:

./easyrsa build-client-full client nopass

Также генерируем список отзыва сертификатов (CRL — Certificate Revocation List):

./easyrsa gen-crl

Теперь, когда все необходимые сертификаты созданы, можно переходить к настройке сервера Angie.

Настройка mTLS в Angie

Настроим для проверки работы mTLS тестовый сервер. Настройка сходна с обычным HTTPS, но будет иметь несколько дополнительных директив:

server {
  listen 443 ssl;
  server_name server;
  
  ssl_certificate     /etc/angie/ssl/server.crt;
  ssl_certificate_key /etc/angie/ssl/server.key;
  ssl_client_certificate /etc/angie/easy-rsa/pki/ca.crt;
  ssl_crl /etc/angie/easy-rsa/pki/crl.pem;
  ssl_verify_client  on;

  root /usr/share/angie/html;
}

Как можно видеть, мы используем привычные директивы ssl_certificate и ssl_certificate_key, чтобы указать сертификат и ключ сервера. Рассмотрим новые директивы для mTLS:

  • ssl_client_certificate — сертификат нашего удостоверяющего центра (для проверки клиентских сертификатов);

  • ssl_crl — список отозванных сертификатов (для отзыва доступа).

  • ssl_verify_client — включение проверки клиентских сертификатов.

В этой конфигурации мы включили строгую проверку клиентских сертификатов (ssl_verify_client on). Также возможна конфигурация, где проверка сертификатов будет необязательной (optional) или вообще не будет проводиться, но запрос на сертификат будет отправлен (optional_no_ca). 

Проверяем и обновляем конфигурацию Angie:

angie -t
systemctl reload angie

Если конфигурация обновилась и ошибок в /var/log/angie/error.log нет, можно приступать к тестированию настроек.

Проверка подключения

Начнём с простого метода тестирования подключения утилитой curl. Нам понадобится указать в параметрах путь к файлу клиентского сертификата и ключа к нему:

curl --head -Lks --cert /etc/angie/easy-rsa/pki/issued/client.crt \
 --key /etc/angie/easy-rsa/pki/private/client.key https://localhost

Также мы отключаем проверку валидности сертификата сервера (так как он не является доверенным с точки зрения системы). В случае успешного запроса мы получим ответ сервера с кодом 200:

HTTP/1.1 200 OK
Server: Angie/1.10.2
Date: Wed, 12 Nov 2025 12:44:41 GMT
...

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

Сначала нужно подготовить файл для импорта в браузер. Клиентский сертификат и ключ будут экспортированы в файл формата PKCS12. Для этого можно использовать утилиту openssl:

openssl pkcs12 -export \
 -in /etc/angie/easy-rsa/pki/issued/client.crt \
 -inkey /etc/angie/easy-rsa/pki/private/client.key -out client.p12

При экспорте будет запрошен пароль — он потребуется для импорта сертификата в браузер. Полученный файл (client.p12) необходимо скопировать на клиентскую машину для импорта в браузер.

Открываем страницу настроек сертификатов в Chrome (chrome://settings/certificates). В разделе управления сертификатами (Manage certificates) находим раздел собственных сертификатов (Your certificates) и нажимаем кнопку импорта (Import). Указываем путь к файлу client.p12 и вводим пароль, который мы указывали при экспорте командой openssl.

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

Управление сертификатами в EasyRSA

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

./easyrsa renew server

Для обновления клиентского сертификата:

./easyrsa renew client

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

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

./easyrsa revoke client
./easyrsa gen-crl

Чтобы список применился, обновите конфигурацию Angie:

systemctl reload angie

Теперь нам знакомы базовые манипуляции с сертификатами, выпущенными с помощью EasyRSA.

Итоги

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