Мне потребовалось сделать тестовый сервер, принимающий 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 с официального сайта
Далее создаем новую виртуальную машину







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


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







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




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

Установка софта
Изначально можно залогиниться под 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>