Настройка OpenVPN Server + tls-server + dh + ca + cert + key + crl-verify + tls-auth

на базе FreeBSD и виндовые клиенты

Arkan

В конторе потребовалось подключить несколько удаленных филиалов к главному офису, и основная проблемма заключалась в том что филиальные шлюзы изначально были на винде и переустановить эти шлюзы на FreeBSD или на Linux просто не в состоянии так как и филиалы очень далеко и админов по *nix в тех вилиалах найти невозможно

Основная часть из имеющихся филиалов уже благополучно работала на IPSEC туннелях ( это как бы намек на то как можно сделать лучше )

Приступим:

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

Заходим на предполагаемый сервер под root

далее будем ставить openvpn из портов

cd /usr/ports/security/openvpn

make install clean

===> Cleaning for openvpn-2.2.2

Все конфиги и сертификаты у нас на сервере FreeBSD будут располагаться в /usr/local/etc/openvpn/

Для создания этой папки, а также всех необходимых вложенных папок и файлов необходимо выполнить следующую последовательность команд:

mkdir /usr/local/etc/openvpn
cd /usr/local/etc/openvpn
mkdir ccd
# конфигурации удаленных клиентов
mkdir certs # сертификаты клиентов и сервера
mkdir crl # списки отзыва сертификатов
mkdir keys # закрытые ключи сертификатов клиентов и сервера
mkdir private # закрытый ключ самоподписного доверенного сертификата
mkdir req # запросы на сертификаты
chmod 700 keys private #
устанавливаем права доступа к каталогу

создают базу данных сертификатов (файлы serial и index.txt).

echo "01" > seri

touch index.txt

Ни чего сложного и сверх естественного в настройках нет, но так или иначе мне потребовалось довольно долго поломать голову куда как и какой сертификат привинтить.

Файл конфигурации OpenSSL

По умолчанию OpenSSL использует файл конфигурации /etc/ssl/openssl.cnf. Я рекомендую создать отдельный файл конфигурации OpenSSL в папке /usr/local/etc/openvpn. Данный файл должен называться openssl.cnf

------------------------------------------------------------------------------------

[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /usr/local/etc/openvpn
crl_dir = $dir/crl
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/CA_cert.pem
serial = $dir/serial
crl = $dir/crl/crl.pem
private_key = $dir/private/CA_key.pem
RANDFILE = $dir/private/.rand
default_days = 3650
default_crl_days = 365
default_md = md5
unique_subject = yes
policy = policy_any
x509_extensions = user_extensions
[ policy_any ]
organizationName = match
organizationalUnitName = optional
commonName = supplied
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = CA_extensions
[ req_distinguished_name ]
organizationName = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName = Location Name
commonName = Common User or Org Name
commonName_max = 64
[ user_extensions ]
basicConstraints = CA:FALSE
[ CA_extensions ]
basicConstraints = CA:TRUE
default_days = 3650
[ server ]
basicConstraints = CA:FALSE
nsCertType = server

------------------------------------------------------------------------------------

Создание самоподписного доверенного сертификата (CA)

Для создания самоподписного доверенного сертификата (Certification Authority, CA) и закрытого ключа для него необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650

Команда req заставляет OpenSSL создать сертификат, ключи: -new - cоздать запрос на сертификат, -nodes - не шифровать закрытый ключ, -x509 (совместно с -new) - создать самоподписной сертификат (CA), -keyout - задает местонахождение закрытого ключа, -out - задает местонахождение самоподписного сертификата, -days - задает время действия сертификата (365x10 дней, что приблизительно равно десяти годам). В процессе выполнения команды на экран будут выданы запросы о вводе таких параметров как: Country Name, State or Province Name; Locality Name; Organization Name; Organizational Unit Name; Common Name; Email Address. Самым важным параметром является значение Common Name. В данном случае оно должно совпадать с FQDN-именем сервера. Для просмотра результата генерации самоподписного сертификата и закрытого ключа необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

------------------------------------------------------------------------------------

Создание сертификата сервера

Перед созданием сертификата сервера необходимо создать запрос на сертификат сервера и закрытый ключ сервера. Для этого необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl req -new -nodes -keyout keys/server.pem -out req/server.pem


Команда и ключи OpenSSL рассмотрены выше. В процессе выполнения комнды Вам опять придется ответить на вопросы. Ответы должны соответствовать ответам из предыдущего пункта. В ответ на дополнительные запросы "A challenge password []:" и "An optional company name []:" необходимо просто нажать <Enter>. Для просмотра результата генерации запроса на сертификат и закрытого ключа сервера необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl req -noout -text -in req/server.pem (для запроса на сертификат)
#openssl rsa -noout -text -in keys/server.pem (для закрытого ключа)

Для создания сертификата сервера необходимо подписать запрос на сертификат сервера самоподписным доверенным сертификатом (CA). Для этого необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem

------------------------------------------------------------------------------------

Создание файла параметров Диффи-Хэлмана

Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl dhparam -out dh2048.pem 2048

Команда dhparam приказывает OpenSSL создать файл параметров Диффи-Хэлмана, число 2048 определяет разрядность в битах. Внимание: данная команда выполняется достаточно медленно даже на очень мощных компьютерах.

------------------------------------------------------------------------------------

Создание списка отзыва сертификатов

Для создания списка отзыва сертификатов необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl ca -config openssl.cnf -gencrl -out crl/crl.pem

Команда ca с ключем -gencrl заставляет OpenSSL создать список отзыва сертификатов, ключи: -config рассмотрен выше, -out - задает местонахождение списка отзыва сертификатов. Данная команда создает пустой список отзыва сертификатов. Для того, чтобы отозвать сертификат клиента Client необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

#openssl ca -config openssl.cnf -revoke certs/bagan.pem

------------------------------------------------------------------------------------

Создание статического ключа HMAC

Для создания статического ключа HMAC, обеспечивающего дополнительную защиту от DoS-атак и флудинга UDP-портов, необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:1 openvpn --genkey --secret ta.key

------------------------------------------------------------------------------------

Создание клиентских сертификатов

передти в каталог где программа OpenVPN
cd /usr/local/etc/openvpn

Создание клиентских сертификатов bagan
openssl req -new -nodes -keyout keys/bagan.key -out req/bagan.pem

Using configuration from openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'ru'
stateOrProvinceName :PRINTABLE:'novosimbirsk'
localityName :PRINTABLE:'novosibirsk'
organizationName :PRINTABLE:'agro.ru'
organizationalUnitName:PRINTABLE:'agro'
commonName :PRINTABLE:'bagan' # для каждого филиала свое
emailAddress :IA5STRING:''admin@agro.ru'
Certificate is to be certified until Nov 24 05:14:09 2022 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated

Внимание !!! все что выше novosimbirsk novosibirsk agro.ru admin@agro.ru писать то же самое для новых клиентских сертификатов а вместо bagan уже другое (я выбираю обычно по названию города или поселка где этот филиал)

заключение
openssl ca -batch -config openssl.cnf -out certs/bagan.cert -infiles req/bagan.pem

Сертификаты готовы

На клиентские тачки скопировать сертификаты bagan.cert и bagan.key
а так же для клиентской тачки понадобится сертификат из папки cd /usr/local/etc/openvpn под названием CA_cert.rem который надо переименовать в ca.crt (так как виндовый openvpn клиент требует строго определенные названия)

Так же из папки сервера cd /usr/local/etc/openvpn на клиентскую тачку надо скопировать файл ta.key

------------------------------------------------------------------------------------

Файл конфигурации сервера

По умолчанию конфигурация сервера OpenVPN хранится в файле openvpn.conf, который должен находится в папке /usr/local/etc/openvpn. В рассматриваемом случае файл конфигурации имеет следующий вид:

так получается что внутренняя корпоративная сетка главного филиала у меня 10.10.10.0/24 а не 192.168.0.0/24

dev tun
mode server
daemon
local 109.202.16.7 ## внешний IP нашего сервера OpenVPN
port 13154 ## любой порт на ваше усмотрение
proto udp
push "dhcp-option DNS 10.10.10.15" # внутренний IP виндовой AD
push "dhcp-option DNS 10.10.10.200" # внутренний IP нашего шлюза FreeBSD
push "dhcp-option WINS 10.10.10.15" # на всякий пожарный
server 10.10.11.0 255.255.255.0
push "route 10.10.10.0 255.255.250.0"
push "route 10.10.11.0 255.255.255.0 10.10.11.1"
push "route 192.168.10.0 255.255.255.0" ## tuta
push "route 192.168.12.0 255.255.255.0" ## test
push "route 192.168.13.0 255.255.255.0" ## bagan
push "route 192.168.84.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0" ## home
route 10.10.11.0 255.255.255.252
route 192.168.10.0 255.255.255.0 ## tuta
route 192.168.12.0 255.255.255.0 ## test
route 192.168.13.0 255.255.255.0 ## bagan
route 192.168.84.0 255.255.255.0
route 192.168.1.0 255.255.255.0 ## home
client-config-dir /usr/local/etc/openvpn/ccd/
ifconfig-pool-persist /usr/local/etc/openvpn/ipp.txt
client-to-client
tls-server
dh /usr/local/etc/openvpn/dh2048.pem
ca /usr/local/etc/openvpn/CA_cert.pem
cert /usr/local/etc/openvpn/certs/server.pem
key /usr/local/etc/openvpn/keys/server.pem
crl-verify /usr/local/etc/openvpn/crl/crl.pem
tls-auth /usr/local/etc/openvpn/ta.key 0
tls-timeout 120
#auth SHA1 # на ваше усмотрение
comp-lzo
keepalive 10 120
tun-mtu 1500
mssfix 1450
max-clients 100
persist-key
persist-tun
user nobody
group nobody
verb 4
status openvpn-status.log
log-append /var/log/openvpn/openvpn.log

------------------------------------------------------------------------------------

Конфиг клиентской тачки под Windows

dev tun
remote 109.202.16.7
proto udp
port 13154
client
pull
resolv-retry infinite
tls-client
ca ca.crt
cert cbagan.cert
key kbagan.key

tls-auth ta.key 1
ns-cert-type server
persist-key
persist-tun
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3

------------------------------------------------------------------------------------

Настройки для клиента

Мы создавали сертификаты bagan и по этой причине надо создать файл в папке /usr/local/etc/openvpn/ccd с названием bagan

iroute 192.168.13.0 255.255.255.0
push "route 192.168.13.0 255.255.255.0"

------------------------------------------------------------------------------------

Автоматический запуск сервера

Для автоматического запуска сервера OpenVPN при загрузке операционной системы необходимо добавить

openvpn_enable="YES" # YES or NO
openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf" # --config file
openvpn_dir="/usr/local/etc/openvpn" # --cd directory

------------------------------------------------------------------------------------

Заключение:

Примите во внимание что виндовый клиент есть виндовый и по этой причине надо название сертификатов на виндовых клиентах соблюдать именно так как захотели разработчики данного ПО

cert cbagan.cert
key kbagan.key

За основу взял статью http://www.sergeysl.ru/freebsd-openvpn-x509/

Обновлено: 12.03.2015