Для тех, кто работал с OpenVPN, привычен метод аутентификации на основе клиентских сертификатов, который используется там по умолчанию.
Мне никогда на глаза не попадалась подобная реализация. Я примерно представлял, что так можно, но когда увидел в недавнем видео, как это легко и быстро настраивается, решил проверить и сделать краткую инструкцию, чтобы можно было повторить в случае необходимости. Мне видится это удобным методом, когда есть возможность установить клиентский сертификат в браузер. Это и безопасно, и удобно для пользователя, если он сумеет один раз настроить доступ.
Для реализации подобного метода понадобится свой CA для выпуска сертификатов, сертификат сервера, сертификаты клиентов. Подойдёт любая инструкция для OpenVPN, где делается всё то же самое. В качестве программы для работы с сертификатами можно использовать:
◽️Easy-RSA - популярный набор скриптов на базе openssl.
◽️Step-CA - своя локальная служба для управления CA с простой автоматизацией перевыпуска.
◽️CFSSL - современная одиночная утилита от CloudFlare с конфигами в формате json.
◽️XCA - кроссплатформенное приложение с GUI, в отличие от предыдущих вариантов консольных команд.
Для простоты и краткости команд я возьму Easy-RSA. Но если вы хотите в графическом интерфейсе всё делать, то берите XCA. Принцип там такой же.
Ставим Easy-RSA:
# apt install easy-rsa
Создаём свой CA:
# make-cadir /etc/angie/easy-rsa
# cd /etc/angie/easy-rsa
# ./easyrsa init-pki
# ./easyrsa build-ca
По умолчанию сертификат для CA выпускается на 10 лет, остальные - на 825 дней. Сделаем остальные тоже 10-ти летними. Добавляем в файл vars параметр:
set_var EASYRSA_CERT_EXPIRE 3650
Заодно увеличим время жизни списка отозванных сертификатов до года. Я не знаю, как ведёт себя Angie, но OpenVPN перестаёт принимать новые аутентификации, когда файл отзывов протухает.
set_var EASYRSA_CRL_DAYS 365
Остальные параметры меняйте по своему усмотрению. Они некритичны. Выпускаем сертификаты и ключи для сервера и первого клиента:
# ./easyrsa build-server-full server nopass
# cp /etc/angie/easy-rsa/pki/issued/server.crt /etc/angie
# cp /etc/angie/easy-rsa/pki/private/server.key /etc/angie
# ./easyrsa build-client-full client01 nopass
Для передачи клиенту сертификат и ключ от него надо упаковать в один контейнер формата PKCS12:
# openssl pkcs12 -export -in /etc/angie/easy-rsa/pki/issued/client01.crt -inkey /etc/angie/easy-rsa/pki/private/client01.key -out client01.p12
Передаём client01.p12 клиенту. Готовим конфигурацию виртуального сервера Angie. Показываю на примере конфигурации default.conf с доступом по IP:
server {
listen 443 ssl;
server_name localhost;
access_log /var/log/angie/host.access.log main;
ssl_certificate /etc/angie/server.crt;
ssl_certificate_key /etc/angie/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;
location / {
root /usr/share/angie/html;
index index.html index.htm;
}
}
Перезапускаю веб сервер:
# angie -t
# angie -s reload
Захожу на веб сервер по IP - получаю ошибку: "400 Bad Request
No required SSL certificate was sent".
Надо добавить сертификат в браузер. В Яндекс.Браузере это делается в разделе Настройки ⇨ Системные ⇨ Сеть ⇨ Управление сертификатами ⇨ Импорт ⇨ Выбираем скопированный файл client01.p12.
Теперь мы попадаем на стандартную страницу веб сервера. Если нужно запретить доступ пользователю - отзываем его сертификат:
# ./easyrsa --batch revoke client01
# ./easyrsa gen-crl
# angie -s reload
Эти команды обновят файл отзывов crl.pem, который проверяет веб сервер. Последний надо обязательно заставить перечитать конфигурацию, иначе он не примет изменения. Теперь client01 получит ошибку доступа: "The SSL certificate error".
Простая и удобная аутентификация. Берите на вооружение.
#angie