Настройка OpenVPN c применением сертификатов X.509 вместо статических ключей

Данная статья не претендует на исчерпывающее повествование по данной теме. В ней не раскрываются все возможности и опции настройки пакетов OpenSSL (http://www.openssl.org/) и OpenVPN (http://www.openvpn.net/).

За более подробной информацией рекомендуется обратится на сайты разработчиков и man-страницы.

Все Изложенное тут является результатом попытки автора решить прикладную задачу подключения удаленных клиентов к серверу не используя при этом статические ключи и дополнительное ПО для управления ключами и сертификатами.

Статья писалась как пошаговое руководство-инструкция для начинающих, позволяющее "с нуля" настроить соединение 2-х и более машин по технологии VPN, используя свободно-распространяемое ПО.

Начиная с версии 2 в пакете OpenVPN появилась возможность создавать соединения типа точка-многоточка с использованием на сервере одного виртуального адаптера - tap/tun - и как следствие использовать один процес демона OpenVPN.

Установка и настройка производится на машине с установленной ОС FreeBSD, настроенной сетевой подсистемой и доступом в Интернет. Автор описал процесс настройки под FreeBSD 4.11-RELEASE-p11 и FreeBSD 5.3-RELEASE-p20, который проверил сам лично.

На машине были установлены пакеты (устанавливалось из коллекции портов при помощи portinstall):

- OpenSSL v. 0.9.7g

- OpenVPN v. 2.0.2

Создание Certificate Authority (CA)

После установки OpenSSL, файл конфигурации (openssl.cnf), потребуется отредактировать, чтобы при необходимости изменить каталоги в которых будут располагаться ключи, сертификаты и прочее во время настройки, а также имена и наименование организации.

Как правило, конфиг располагается в каталоге /usr/local/openssl/, либо в /etc/ssl/.

После редактирования openssl.cnf делаем следующее:

Создаем файл /usr/local/openssl/serial c содержимым '01'

# touch serial

# echo 01 > serial

Создаем каталоги /crl, /newcerts, /private

# mkdir crl newcerts private

Для каталога private, в целях безопастности частного ключа сервера, рекомендую установить права только для пользователя root

# chmod go-rwx private

Создаем пустой файл /usr/local/openssl/index:

# touch index

И наконец создаем сертификат CA

# openssl req -nodes -config openssl.cnf -days 1825

-x509 -newkey rsa -out ca-cert.pem -outform PEM

Создание сертификата X.509

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

Сгенерируем частный ключ для сервера, его настоятельно рекомендуется хранить в тайне:

# openssl genrsa -out host_x.key

Генерируем сертификат:

# openssl req -new -nodes -key host_x.key -out host_x.csr

# openssl ca -batch -config openssl.cnf -in host_x.csr -out host_x.cert

Теперь повторим то же самое, но только для клиента:

# openssl genrsa -out client_x.key

# openssl req -new -nodes -key client_x.key -out client_x.csr

# openssl ca -batch -config openssl.cnf -in client_x.csr -out client_x.cert

И в конце создаем ключик ta.key. Этот ключ используется для предотвращения DoS атак и UDP port flooding

# openvpn --genkey --secret ta.key

Таким образом мы получили подписанный нами же сертификат X.509.

Необходимо повторить эти действия для всех имеющихся у нас машин.

Далее создать ключ Диффи Хельман (подробнее о нем http://www.rsasecurity.com/rsalabs/node.asp?id=2248).Этот ключ используется для шифрования трафика при установлении соединения:

# openssl dhparam -out dh1024.pem 1024

Теперь переходим к конфигурированию самого OpenVPN.

Файл конфигурации для сервера у меня находится в /usr/local/etc/openvpn/ и выглядит так:

proto udp

dev tap0 # использую tap, хотя можно и tun (рекомендуется)

port 1194

# TLS parms

tls-server

ca /etc/ssl/ca-cert.pem

cert /etc/ssl/host_x.cert

key /etc/ssl/host_x.key

dh /etc/ssl/dh1024.pem

mode server

ifconfig 10.10.10.10 255.255.255.248

ifconfig-pool 10.10.10.11 10.10.10.15

duplicate-cn

tls-auth /etc/ssl/ta.key 0

#cipher BF-CBC # Blowfish (default)

#cipher AES-128-CBC # AES

cipher DES-EDE3-CBC # Triple-DES

user nobody

group nobody

persist-key

persist-tun

comp-lzo

keepalive 10 120

status /var/log/openvpn-status.log

log /var/log/openvpn.log

verb 3

Файл конфигурации для клиента у меня такой:

client

proto udp

remote aaa.ccc.yyy.xxx

port 1194

dev tap

resolv-retry infinite

persist-key

persist-tun

tls-client

dh dh1024.pem

ca ca-cert.pem

cert client_x.cert

key client_x.key

#cipher BF-CBC # Blowfish (default)

#cipher AES-128-CBC # AES

cipher DES-EDE3-CBC # Triple-DES

tls-auth ta.key 1

ping 10

comp-lzo

verb 3

mute 10

После создания файлов конфигурации, запускаем демона openvpn на сервере:

# sh /usr/local/etc/rc.d/openvpn.sh start (скрипт созданный при инсталляции)

Проверяем запустился ли демон:

# sockstat | grep openvpn

Если видим что-то вроде:

nobody openvpn 33072 3 udp4 *:1194 *:*

значит сервер готово принимать входящие подключения.

Далее запускаем клиента на своей машине. Рекомендую использовать GUI оболочку, если клиентом будет являться машина с Windows.

Если клиентом выступает машина с FreeBSD , то запуск аналогичен серверной части.

Для прояснения некоторых моментов образования соединения нелишним будет изучить вывод, который пишется в /var/log/openvpn.log.

Именно используя его, автор получил большую часть информации пригодившейся при отладке конфигов. Регулировать детализацию

логирования помогает ключик 'verb',

Для более детального изучения возможностей OpenVPN, настоятельно рекомендую изучить примеры конфигов: http://openvpn.net/howto.html#examples

Ну и конечно рекомендуется не забывать о том, что многие ошибки кто-то совершал и с проблемами сталкивался, а потому Google ваш помощник :)

Обновлено: 12.03.2015