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.