Используем Stunnel в Windows для шифрования трафика между произвольными приложением и сервером

Утилита Stunnel реализует концепцию прокси, который позволяет организовать защищенное TLS подключение для произвольных сетевых приложений, которые сами не умеют шифровать данные. В некоторых случаях это предпочтительнее развертывания полноценного VPN, особенно когда вам нужно обеспечить защищённый удаленный доступ ко всему одному приложению/сервису.

Служба Stunnel работает в режиме сервера или клиента. В режиме клиента stunnel принимает трафик от клиентского приложения, шифрует его и отправляет на сервер. На сервере трафик расшифровывается и передаётся в целевое приложение/службу. При этом вам не нужно вносить изменения в работу клиентской или серверной части. Для аутентификации клиентов можно использовать сертификаты. Stunnel поддерживается как для Windows, так и для Linux.

В примере мы рассмотрим, как с помощью stunnel организовать безопасный доступ между клиентом и сервером. В этом примере в качестве севера используется веб сервер Windows, на котором запущен HTTP сайт без SSL шифрования. Наша задача: ограничить доступ к этому веб сайту со стороны клиентов с аутентификацией по сертификату и обеспечить шифрование трафика.

Настройка сервера stunnel в Windows

Скачайте установщик stunnel для Windows (https://www.stunnel.org/downloads.html) и установите с настройками по умолчанию (включая openssl ).

Установка stunnel

Теперь нужно создать пары ключей и сертификатов для 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"

В поле subj указываем информацию о сертификате, которая будет удобна для их дальнейшей идентификации.

Создать закрытый ключ для сервера:

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

Отредактируйте файл 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
Проверьте, что в строке accept указан номер порта, который не занят другим процессом Windows.

Откройте указанный вами порт в Windows Defender Firewall, чтобы на него можно было принимать подключения. Можно создать разрешающее правило файервола для порта с помощью PowerShell:

New-NetFirewallRule -DisplayName "HRPoral stunnel 443" -Direction Inbound -LocalPort 443 -Protocol TCP -Action Allow

Незащищенный 80 порт для внешних подключений нужно будет заблокировать для внешних подключений (на уровне маршрутизатора, или в файерволе).

Запустите stunnel.exe и в логах графического интерфейса проверьте, что конфигурация создана без ошибок. Графический интерфейс позволяет быстро перечитать конфиг файл, сразу увидеть ошибку в логах, что удобно при отладке.

stunnel.exe GUI интерфейс

После этого завершите 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

Настройка клиента 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 прокинет ваше подключение на удаленный сервер.

установка шифрованного туннеля stunnel между клиентом и сервером

Для удобства можно объединять сертификаты и ключи в один файл. Например:

Get-Content client.key, client.crt | Set-Content client.pem

В этом случае в конфигурационном файле stunnel достаточно будет указать только:

cert = client1.pem

Если все получилось, можно запустите stunnel как службу:

stunnel.exe -install

запуск stunel службы на клиенте

Для обеспечения процедуры отзыва сертификатов (например, скомпрометированных), нужно в конфигурации сервера добавить опцию CRLpath. Здесь нужно указать путь к папке, где хранятся отозванные сертификаты (Certificate Revocation Lists) в формате PEM.

Также можно использовать опцию CApath для указания пути к папке с разрешенными сертификатами.


Предыдущая статья Следующая статья


Комментариев: 0 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)