Авторизация для stunnel с помощью сертификатов openvpn

Stunnel довольно простая программа, назначение которой создавать SSL туннели. Необходимость в них может возникнуть если программа, слушающая какой-то порт, не поддерживает шифрование, или чтобы ограничить подключения на конкретный порт из интернета.

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

Предположим, что сервер openVPN уже настроен и работает, авторизация клиентов производится по ключам формата PKCS#12. После установки stunnel приводим его конфиг к виду:

; Certificate/key is needed in server mode and optional in client mode
cert = /etc/openvpn/server.crt
key  = /etc/openvpn/server.key

; Protocol version (all, SSLv2, SSLv3, TLSv1)
sslVersion = SSLv3

; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
compression = zlib

; Authentication stuff
verify = 2
CAfile = /etc/openvpn/ca.crt

; Service-level configuration

[https]
accept  = 443
connect = 80

Теперь перейдем к клиенту. Stunnel, к сожалению, не понимает сертификаты в формате PKCS#12, поэтому нужно выполнить конвертацию:

rascal@localhost:~$ openssl pkcs12 -in client.p12 -out client.pem

И конфиг для клиента будет выглядеть, примерно, так:

; Certificate/key is needed in server mode and optional in client mode
cert = client.pem

; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

; Use it for client mode
client = yes

; Service-level configuration

[https]
accept  = 80
connect = 1.2.3.4:443

Здесь, 1.2.3.4 — ip хоста на котором stunnel работает в качестве сервера. После запуска stunnel в такой конфигурации трафик на 80-й порт локальной машины по SSL туннелю будет попадать на 80-й же порт хоста 1.2.3.4.