Опыты на досуге #1 - делаем авторизацию с клиентским сертификатом на nginx

Мне потребовалось сделать тестовый сервер, принимающий POST запросы с аутентификацией по клиентскому сертификату. Пока не буду рассказывать для чего это, просто изучаю Java и нужно отлаживать отправку запросов с mtls. Статья достаточно подробная и "сырая", всё как есть, чтобы не забыть все действия и переиспользовать их в дальнейшем.

Вводные данные

Итак, что у нас есть:

  • Некая машина для опытов с виртуализацией: Windows 10 (можно использовать и Linux и Mac по вкусу)
  • Виртуализатор, я буду использовать Hyper-V
  • Клиентское ПО для проброса запросов
  • Софт для подключения по ssh - можно использовать обычный PowerShell, можно Windows Terminal
В данных экспериментах мы не будем использовать "правильные" сертификаты, такие как LetsEncrypt, наша цель вообще разобраться как их выпускать, подписывать и т.д.

Создание и настройка виртуальной машины на Hyper-V

Заходим в приложения, там справа будет пункт "Программы и компоненты"

Далее выбираем пункт "включение или отключение компонентов"

Теперь нужно активировать Hyper-V в компонентах, нажать ОК и перезагрузиться

Будьте внимательны, при активации Hyper-V вы не сможете запускать другие варианты виртуализаторов, такие как VirtualBox, Vmware Player и др., если у вас используется другая система виртуализации, то лучше используйте ее и пропустите этот раздел

После перезагрузки запускаем Диспетчер Hyper-V и создаем наш первый виртуальный коммутатор

Мы сделали коммутатор с внутреней сетью, который имеет доступ к нашей машине и другим виртуалкам в этом коммутаторе, будет использовать NAT

Далее нужно зайти в свойства сетей и прописать для нашего адаптера ip адрес, когда то можно было использовать Default Switch для этих целей, но с последними обновлениями он стал самостоятельно переопределять адреса.

Подсеть специально создана 192.168.200.0/24 чтобы не пересекаться с моей внутренней локалкой 192.168.0.0/24, а шлюз не указан с той целью, чтобы не портить существующих маршрутов на хост-машине.

Теперь остается добавить NAT (SNAT) чтобы наши машины из 200 сети подменялись айпишником хост-машины и ответы прилетали обратно из внешней сети.

Открываем PowerShell с правами администратора

Вводим команду

New-NetNat -Name nat1 -InternalIPInterfaceAddressPrefix 192.168.200.0/24

Подробнее об DNAT (пробросе портов) можно почитать тут https://tech-research.ru/nastroika-sieti-v-hyper-v-chieriez-nat-probros-portov/

На этом этапе считаем что наш виртуализатор готов к использованию сети по NAT...

Установка Linux (Debian)

Качаем iso-образ Debian net install с официального сайта

Далее создаем новую виртуальную машину

указываем имя машины по вкусу
указываем поколение
указываем размер памяти, у меня много оперативки, поэтому могу и 10 гиг выделить
укажем для машины созданный нами коммутатор
тут все хватит и так, а можно и меньше
укажем наш iso из которого будем ставить систему

После создания системы нужно правой кнопкой по ней кликнуть и кое-что подкрутить

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

Далее стартуем и ставим систему, выбираем просто Install

тут всё стандартно
тут сразу можно нажать отмену и настроить сеть вручную
тут настроим наш айпи из той же подсети, что выделили новому адаптеру
всё оставляем как есть
тоже аналогично
а вот dns укажем или наш wifi роутер или провайдерский

Далее несколько шагов, там всё по своему усмотрению

на тестовых машинах я обычно ставлю всё на один раздел, но для прома можно заморочиться и посчитать

пробелом снимаем все галочки, добавим только ssh и стандартные утилиты

Через несколько секунд система предложит нам извлечь сидиром и перезагрузиться....

Установка софта

Изначально можно залогиниться под root прямо из окошка Hyper-V, а можно зайти по ssh под пользователем и набрать команду su

Все действия выполняем от суперпользователя, иначе нужно установить sudo и добавлять перед каждой командой sudo

Первое, что нужно в новой системе, это навести порядок в репозиториях

nano /etc/apt/sources.list

По умолчанию у нас что-то типа такого

deb http://deb.debian.org/debian/ bullseye main
deb-src http://deb.debian.org/debian/ bullseye main

deb http://security.debian.org/debian-security bullseye-security main
deb-src http://security.debian.org/debian-security bullseye-security main

deb http://deb.debian.org/debian/ bullseye-updates main
deb-src http://deb.debian.org/debian/ bullseye-updates main

У нас подключены только ветки main, но нет contrib и non-free, поэтому список пакетов ограничен, добавим их

Далее сохраняем файл в нано через ctrl+w, выходим ctrl+x

Теперь обновим репозиторий и систему

apt update && apt upgrade

Далее поставим самое необходимое

apt install nginx php-fpm

Конфигурация NGINX + FPM

Данная конфигурация похожа больше на Hello World, в проме требуются более тщательные тонкие настройки, тут у нас нет деления по доменным именам, только один хост, к которому привязан некий простейший обработчик на PHP
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl default_server;
        ssl_certificate /opt/ssl/server.crt;
        ssl_certificate_key /opt/ssl/server.key;
        #mtls
        ssl_client_certificate /opt/ssl/trust.crt;
        ssl_trusted_certificate /opt/ssl/client1.crt;
        ssl_verify_client optional;

        root /www;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }


        location  ~ \.php$ {
                include snippets/fastcgi-php.conf;

                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

                fastcgi_param           X-SSL-CERT        $ssl_client_cert;
                fastcgi_param           X-SSL-VERIFIED    $ssl_client_verify;
                fastcgi_param           X-SSL-CLIENT-DN   $ssl_client_s_dn;
                fastcgi_param           X-SSL-ISSUER-DN   $ssl_client_i_dn;
                fastcgi_param           HTTP_PROXY      "";
                fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial;
        }
}
<pre>
<?php print_r($_SERVER); ?>
POST=
<?php print_r($_POST)?>
GET=
<?php print_r($_GET)?>
RAW=
<?=file_get_contents('php://input')?>
</pre>
Показать комментарии