• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Статья также доступна на украинском (перейти к просмотру).

Настройка авторизации через SSL сертификат на уровне Nginx

Оглавление

Часто возникает потребность в установлении ограниченного доступа пользователям к тем или иным страницам веб-ресурса, что обусловлено вопросами безопасности при работе с конфиденциальной информацией. Это можно решить путем настройки авторизации посредством SSL/TLS сертификатов на уровне веб-сервера. Такой подход очень удобен для взаимодействия с API . Продемонстрируем трудоспособность указанного подхода на практике.

Предпосылки и предварительные действия

Для реализации этого подхода будет задействован веб-сервер Nginx, ОС Ubuntu 22.04 и возможности центра сертификации Let’s Encrypt,предоставляющего для шифрования данных бесплатные криптографические сертификаты типа X.509. Пакет с плагинами настройки и получения сертификатов Let's Encrypt включен в официальный репозиторий дистрибутива Debian, предоставляющий широкие возможности для его применения в Linux-подобных системах.

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

N = 2x ,

где х – количество битов, котрыми кодируются ключи.

Наименее надежен RSA-метод. Наиболее надежны методы шифрования, основанные на эллиптических кривых, в частности, это secp384r1. В этом случае ключ будет иметь длину в 384 бита, что соотносится с длиной в 7680 бит при использовании метода RSA. То есть, принципиально с помощью RSA можно получить такую ??же защиту, как и при использовании метода эллиптических кривых, однако, за счет значительного увеличения количества кодирующих битов. В результате, при практическом использовании такого канала неизбежны задержки передачи данных на уровне девайсов и другие «побочные эффекты». Именно поэтому для настройки авторизации посредством SSL/TLS сертификатов мы рекомендуем применять методы secp384r1 или secp512r1. В нашем случае будет использован метод secp384r1.

Проверим наличие и версии программных компонентов, установленных в нашей системе. В первую очередь, проверим сервис OpenSSL. Для этого наберем в терминале:

$ openssl version -a

Проверка версии OpenSSL

Итак, установлена версия OpenSSL 3.0.2, которая нас вполне устраивает.

Проверим статус службы веб-сервера Nginx:Nginx:

$ systemctl status nginx

Cтатус службы веб-сервера Nginx

Как видим, сервер запущен, значит, можно работать.

Рассмотрим существующие каталоги и файлы в системе веб-сервера, это нам пригодится в дальнейшем при внесении изменений в конфигурационные файлы:

$ ls /etc/nginx/

Имеющиеся каталоги и файлы в системе веб-сервера

Формирование структуры каталогов и файлов

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

$ mkdir /etc/nginx/site.ua
$ cd /etc/nginx/site.ua

Где site.ua – директория для нашего веб-ресурса. Создадим в ней набор каталогов для хранения сертификатов разного назначения:

Директория для веб-ресурса

$ mkdir usr_certs
$ mkdir certs
$ mkdir new_certs

Набор каталогов для хранения сертификатов

Создадим набор конфигурационных файлов:

$ touch index.txt
$ touch main.conf
$ touch ser_nom

Набор конфігурационных файлов

Внесем в файл ser_nom исходный номер сертификата, с которого начнется автоматический отсчет для других сертификатов:

$ echo "01" > ser_nom

Начальный номер сертифіката

Ограничим доступ к каталогу site.ua таким образом, чтобы только его владелец мог читать, записывать и запускать на исполнение содержащиеся в нем файлы:

$ chmod 700 ./

Ограничение доступ к каталогу

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

Создадим свой доверенный сертификат на базе алгоритма шифрования типа эллиптические кривые. Для этого сначала отправим запрос на генерирование ключа для него с названием main:

$ openssl ecparam -out /etc/nginx/site.ua/certs/main.key -name secp384r1 -genkey

Где secp384r1 – название метода шифрования ключа (эллиптические кривые).

Метод шифрования ключа

Теперь сформируем запрос на создание нового сертификата под названием main.crt:

$ openssl req -new -x509 -days 500 -sha512 -key /etc/nginx/site.ua/certs/main.key 
-subj /O=Ukraine/emailAddress=alexandr7500g@gmail.com 
-out /etc/nginx/site.ua/certs/main.crt

Здесь опция x509 – указывает на создание самоподписанного сертификата; опция days устанавливает срок его действия (500 дней); параметр O – фиксирует название нашей компании (Ukraine); emailAddress – почта компании; out – указание на место, где будет создан файл сертификата.

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

Убедимся, что ключ и сертификат были созданы. Для этого наберем в терминале:

$ ls certs

Проверка создания ключей сертификата

Да, файлы с названиями main.key и main.crt находятся в своем месте.

Настройки Nginx

Добавим к файлу настроек сервера Nginx для нашего сайта, значение некоторых важных параметров относительно верификации агентов. Для этого вызовем редактор nano:

$ nano ../sites-enabled/site.ua

Вставим в файл следующие параметры с соответствующими значениями:

ssl_client_certificate – путь к местонахождению главного сертификата;

ssl_verify_client – разрешение на верификацию клиента;

keepalive_timeout – максимальное допустимое время (с) для установки соединение.

Параметры верификации агентов

Для автоматического создания сертификатов добавим необходимые параметры с соответствующими значениями к созданному нами ранее главному конфигурационному файлу main.conf. Для этого наберем в терминале:

$ nano main.conf

Добавляем в файл следующие строки:

[ ca ]
    	default_ca         	= CA_CLIENT      	
        
        [ CA_CLIENT ]
    	dir                    = /etc/nginx/site.ua/        	
        certs              	= /etc/nginx/site.ua/certs  	
        new_certs_dir      	= /etc/nginx/site.ua/new_certs  
 
    	database           	= $dir/index.txt 
        
        serial                 = $dir/ser_nom 	
        
        
        certificate        	= $dir/certs/main.crt    	
        private_key        	= $dir/certs/main.key    	
 
    	default_days       	= 365     	
        default_crl_days   	= 5           	
        default_md         	= md5         	
 
    	policy             	= policy_anything
        
        
       [ policy_anything ]
    	countryName        	= optional    	
        stateOrProvinceName	= optional        
        localityName       	= optional    	
        organizationName   	= optional    	
        organizationalUnitName = supplied    	
        commonName         	= supplied    	
        emailAddress       	= supplied

Автоматизация создания сертификатов

Сохраним внесенные изменения и выйдем из редактора (ctrl+X).

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

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

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

$ openssl ecparam -out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.key -name secp384r1 -genkey

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

Теперь сформируем запрос на создание CSR сертификата. Для этого введем в терминале:

$ openssl req -new -key /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.key 
-subj /C=UA/ST=Kievregion/L=Kiev/OU=Alexander/CN=FreeHost/emailAddress=alexandr7500@meta.ua 
-out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.csr

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

Убедимся, что ключ и сертификат были созданы:

$ ls /etc/nginx/site.ua/usr_certs

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

Так оно и есть – файлы с именами alexandr7500@meta.ua.key и alexandr7500@meta.ua.csr доступны в директории usr_certs.

Теперь остается создать пользовательский CRT сертификат с помощью следующего запроса:

$ openssl ca -config /etc/nginx/site.ua/main.conf -in /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.csr -out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.crt -batch

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

Итак, сертификат был успешно создан.

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

countryName              	:PRINTABLE:'UA'
stateOrProvinceName 	:ASN.1 12:'Kievregion'
localityName               	:ASN.1 12:'Kiev'
organizationalUnitName :ASN.1 12:'Alexander'
commonName             	:ASN.1 12:'FreeHost'
emailAddress                   :IA5STRING:'alexandr7500@meta.ua'

Созданные параметры пользователя

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

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

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

$ openssl pkcs12 -export -in /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.crt 
-inkey /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.key 
-out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.p12 -passout pass:789Bbmbm!

Теперь можно загрузить файл с расширением P12 на устройство и передать его пользователю вместе с паролем доступа.

Настройка браузера

Для подключения к веб-серверу пользователю необходимо подключить сертификат к браузеру, используемому на его устройстве. Например, используем браузер Mozilla Firefox для осуществления настроек.

Для этого выбираем следующие команды главного меню браузера:Наслаштування-Додаткові.

Подключение сертификата к браузеру

В открывшемся окне выбираем команду Просмотр сертификатов и попадаем в окно Управление сертификатами, как показано ниже.

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

Переходим к закладке Ваши сертификаты и в нижней части окна выбираем команду Импортировать.

Импорт сертифіката

Выбираем сертификат, вводим пароль доступа и нажимаем кнопку ОК.

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

Удаление и отзыв сертификатов

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

  • Очистить директорию, в которой хранятся указанные документы (usr_certs в нашем случае);
  • Удалить запись пользователя в файле index.txt;
  • Удалить последнее число из файла ser_nom.

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

Дата-центр FREEhost.UA предлагает надежные VPS серверы для обучения и высоконагруженных проектов. Круглосуточная техническая поддержка, более 25 шаблонов с наиболее востребованным программным обеспечением для автоматического создания сервера, ежедневное резервное копирование – это лишь часть преимуществ, которые Вы получите, используя наши надежные серверы.

Подписывайтесь на наш телеграм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.

Смотрите наш канал Youtube на https://www.youtube.com/freehostua.

Мы в чем-то ошиблись, или что-то пропустили?

Напишите об этом в комментариях на сайте и в телеграм-канале. Мы с удовольствием ответим и обсудим Ваши замечания и предложения.

Дата: 27.10.2023
Автор: Александр Ровник
Голосование

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:

comments powered by Disqus
navigate
go
exit
Спасибо, что выбираете FREEhost.UA