Авторизация для stunnel с помощью сертификатов 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, поэтому нужно выполнить конвертацию:

 [email protected]:~$ 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.