Утилита Stunnel реализует концепцию прокси, который позволяет организовать защищенное TLS подключение для произвольных сетевых приложений, которые сами не умеют шифровать данные. В некоторых случаях это предпочтительнее развертывания полноценного VPN, особенно когда вам нужно обеспечить защищённый удаленный доступ ко всему одному приложению/сервису.
В примере мы рассмотрим, как с помощью stunnel организовать безопасный доступ между клиентом и сервером. В этом примере в качестве севера используется веб сервер Windows, на котором запущен HTTP сайт без SSL шифрования. Наша задача: ограничить доступ к этому веб сайту со стороны клиентов с аутентификацией по сертификату и обеспечить шифрование трафика.
Настройка сервера stunnel в Windows
Скачайте установщик stunnel для Windows (https://www.stunnel.org/downloads.html) и установите с настройками по умолчанию (включая
openssl
).
Теперь нужно создать пары ключей и сертификатов для CA, сервера и клиентов. Откройте командную строку и перейдите в каталог:
cd "c:\Program Files (x86)\stunnel\bin"
Сгенерируйте ключ CA:
openssl genpkey -algorithm RSA -out ca.key
Создаем сертификат CA:
openssl req -new -x509 -key ca.key -out ca.crt -subj "/O=Winitro/OU=IT/CN=CA_webserver1.ru"
Создать закрытый ключ для сервера:
openssl genpkey -algorithm RSA -out server.key
Создаем запрос на выпуск сертификата (CSR):
openssl req -key server.key -new -out server.csr
Подписываем сертификат сервера корневым CA:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -subj "/O=Winitro/OU=IT/CN=server_webserver1.ru"
Теперь создаем закрытый ключ для клиента:
openssl genpkey -algorithm RSA -out client.key
Запрос на выпуск сертификата клиента:
openssl req -key client.key -new -out client.csr
Подписываем сертификат клиента:
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -subj "/O=Winitro/OU=IT/CN=client1_webserver1.ru"
На сервере скопируйте файлы ca.crt, server.crt и server.key в каталог C:\Program Files (x86)\stunnel\config.
Отредактируйте файл stunnel.conf (можно очистить дефолтные настройки) и добавьте такую конфигурацию:
; Записывать логи в stunnel.log debug = info output = stunnel.log ; Настройки надежного шифрования. Предполагаем, что на обоих устройствах используются современные CPU с поддержкой аппаратного ускорений AES. Если такие настройки шифрования при большом трафике будут вызывать снижение производительности сервера, их можно будет сделать более простыми. options = CIPHER_SERVER_PREFERENCE options = NO_SSLv2 options = NO_SSLv3 options = NO_TLSv1 sslVersion = TLSv1.2 sslVersion = TLSv1.3 ciphers = ECDHE-RSA-AES256-GCM-SHA384 ; имена (пути) к файлам сертификатов cert = server.crt key = server.key CAfile = ca.crt ; в этой секции описывается конфигурация сервиса, к которому мы будет организовывать доступ через stunnel [HRPoral] ; IP адрес и порт, на котором должен слушать экземпляр stunnel и ожидать подключений accept = 192.168.158.144:443 ; или accept = 443 ; IP и порт сервиса (в нашем случае это локальный HTTP сайт), куда нужно перенаправлять подключение connect = 127.0.0.1:80 ; или connect = 80 ; всегда проверять сертификат удаленного компьютера (подключение невозможно без сертификата) verify=2
Откройте указанный вами порт в Windows Defender Firewall, чтобы на него можно было принимать подключения. Можно создать разрешающее правило файервола для порта с помощью PowerShell:
New-NetFirewallRule -DisplayName "HRPoral stunnel 443" -Direction Inbound -LocalPort 443 -Protocol TCP -Action Allow
Запустите
stunnel.exe
и в логах графического интерфейса проверьте, что конфигурация создана без ошибок. Графический интерфейс позволяет быстро перечитать конфиг файл, сразу увидеть ошибку в логах, что удобно при отладке.
После этого завершите stunnel.exe (Terminate в меню) и можно запустить stunnel как службу Windows. Выполните команду:
"C:\Program Files (x86)\stunnel\bin\stunnel.exe" -install "C:\Program Files (x86)\stunnel\config\stunnel.conf"
В системе появится служба Stunnel TLS wrapper. Запустите ее:
Start-Service wrapper
После запуска, процесс stunnel начинает слушать на порту 443.
Настройка клиента stunnel в Windows
На клиенте также установите stunnel из этого же дистрибутива. Затем скопируйте с сервера файлы ca.crt, client.crt и client.key в папку
C:\Program Files (x86)\stunnel\config
.
В конфигурационном файле stunnel.conf укажите:
[HRPoral] ; stunnel работает в режиме клиента client = yes ; адрес и порт, на котором будет доступен ваш сервис (будет использоваться для доступа вашими клиентами) accept = localhost:8080 ; адрес нашего сервера, куда мы будем перенаправлять подключение connect = 192.168.158.144:443 ; пути к сертификатам CAfile = ca.crt cert = client.crt key = client.key ; обязательно проверять сертификаты при подключении verify=2
Сохраните файл, сначала запустите stunnel.exe вручную, проверьте что в логах нет ошибок. Теперь при вводе в браузере адреса
localhost:8080
, stunnel прокинет ваше подключение на удаленный сервер.
Get-Content client.key, client.crt | Set-Content client.pem
В этом случае в конфигурационном файле stunnel достаточно будет указать только:
cert = client1.pem
Если все получилось, можно запустите stunnel как службу:
stunnel.exe -install
Для обеспечения процедуры отзыва сертификатов (например, скомпрометированных), нужно в конфигурации сервера добавить опцию CRLpath. Здесь нужно указать путь к папке, где хранятся отозванные сертификаты (Certificate Revocation Lists) в формате PEM.
Также можно использовать опцию CApath для указания пути к папке с разрешенными сертификатами.