Перейти к содержанию

05.02.2012

1

Установка OpenVPN сервера

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

В этой статье рассматривается установка и создание ключей и сертификатов для OpenVPN cервера и клиентов под Debian GNU/Linux. Несмотря на то, что статья написана для описания процесса соединения локальных сетей двух офисов, описанное здесь действия универсальны для любых целей использования OpenVPN.

Установка OpenVPN

Убедитесь, что пакет openvpn уже установлен. Если еще нет, то в Debian его можно установить, например так:

apt-get install openvpn
root@router ~ # apt-get install openvpn
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  liblzo2-2 libpkcs11-helper1
The following NEW packages will be installed:
  liblzo2-2 libpkcs11-helper1 openvpn
0 upgraded, 3 newly installed, 0 to remove and 2 not upgraded.
Need to get 613 kB of archives.
After this operation, 1,474 kB of additional disk space will be used.
Do you want to continue [Y/n]?
Get:1 http://ftp.debian.org/debian/ testing/main liblzo2-2 i386 2.06-1 [66.2 kB]
Get:2 http://ftp.debian.org/debian/ testing/main libpkcs11-helper1 i386 1.09-1 [49.2 kB]
Get:3 http://ftp.debian.org/debian/ testing/main openvpn i386 2.2.1-3 [497 kB]
Fetched 613 kB in 0s (3,450 kB/s)
Preconfiguring packages ...
Selecting previously unselected package liblzo2-2.
(Reading database ... 51278 files and directories currently installed.)
Unpacking liblzo2-2 (from .../liblzo2-2_2.06-1_i386.deb) ...
Selecting previously unselected package libpkcs11-helper1.
Unpacking libpkcs11-helper1 (from .../libpkcs11-helper1_1.09-1_i386.deb) ...
Selecting previously unselected package openvpn.
Unpacking openvpn (from .../openvpn_2.2.1-3_i386.deb) ...
Processing triggers for man-db ...
Setting up liblzo2-2 (2.06-1) ...
Setting up libpkcs11-helper1 (1.09-1) ...
Setting up openvpn (2.2.1-3) ...
Restarting virtual private network daemon.:.
localepurge: Disk space freed in /usr/share/locale: 0 KiB
localepurge: Disk space freed in /usr/share/man: 0 KiB

Total disk space freed by localepurge: 0 KiB

Создание сертификатов и ключей для OpenVPN

Для функционирования OpenVPN необходим сертификат сервера и сертификаты клиентов, выпущенные одним Центром Сертификации (Certification Authority, CA), то есть требуется инфраструктура открытых ключей (Public Key Infrastructure, PKI). Самый простой способ получить эти сертификаты, это воспользоваться входящим в пакет набором скриптов easy-rsa на OpenVPN сервере, который будет принимать входящие подключения.

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

cp -R /usr/share/easy-rsa/ /etc/openvpn

Теперь необходимые для настройки OpenVPN PKI файлы теперь находятся в каталоге /etc/openvpn/easy-rsa/ . Они понадобятся для создания ключей и сертификатов.

Настройка переменных для OpenVPN PKI

Чтобы меньше набирать в последующих действиях, стоит внести несколько исправлений в файл /etc/openvpn/easy-rsa/vars . В самом конце файла находится несколько строк определяющих содержимое создаваемых сертификатов. Измените это по своему усмотрению:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="YourProvince"
export KEY_CITY="YourCity"
export KEY_ORG="YourCompany"
export KEY_EMAIL="mail@example.com"
export KEY_CN="CommonName"
export KEY_NAME="KeyName"
export KEY_OU="OrganisationUnit"

KEY_CN, т.е. Common Name сертификата необходимо будет указывать свое для каждого сертификата, таким образом стоит оставить это полу пустым, или ввести что-то, что будет в любом сертификате.

Cтрочки:

export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

лучше закоментировать, эти переменные определены выше.

Из необязательного, можно увеличить размер ключа до 2048, изменив 1024 на 2048 в строке:

export KEY_SIZE=1024

но следует помнить, что это увеличит накладные расходы.

Следующие две строки определяют срок действия выдаваемых сертификатов в днях:

# Срок действия сертификата Центра Сертификации
export CA_EXPIRE=3650
# Срок действия выпускаемых сертификатов
export KEY_EXPIRE=3650

где значение по-умолчанию составляет приблизительно 10 лет, что более чем достаточно.

Инициализируем инфраструктуру открытых ключей (PKI) для OpenVPN

Следующие команды инициализируют Центр Сертификации (CA) и PKI:

cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-ca

Последняя команда запустит генерацию сертификата Центра Сертификации (CA), задав предварительно несколько вопросов, на большинство из которых было отвечено при внесении изменений в файл /etc/openvpn/easy-rsa/vars . Лишь Common Name сертификата должно быть уникальным.

root@router1 ~ # cd /etc/openvpn/easy-rsa/
root@router1 /etc/openvpn/easy-rsa # source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
root@router1 /etc/openvpn/easy-rsa # ./clean-all
root@router1 /etc/openvpn/easy-rsa # ./build-ca
Generating a 1024 bit RSA private key
...........................................++++++
.++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [YourProvince]:
Locality Name (eg, city) [YourCity]:
Organization Name (eg, company) [YourCompany]:
Organizational Unit Name (eg, section) [OrganisationUnit]:
Common Name (eg, your name or your server's hostname) [CommonName]:CompanyOpenVPNRCA
Name [KeyName]:CompanyOpenVPNRCA
Email Address [mail@example.com]:

В результате будет сгенерировано два файла: ca.crt с сертификатом центра сертификации и ca.key с приватным ключом. Важно убедиться, что права на чтение приватного ключа есть только у root. Это ключ центра сертификации, и он не должен быть скомпрометирован, иначе придется перевыпустить все сертификаты, так как злоумышленник завладевший таким сертификатом сможет подключиться к OpenVPN серверу.

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

Выпуск сертификата сервера выполняется при помощи команды:

./build-key-server server

по-умолчанию, Common Name сертификата будет server, что в большинстве случаев очень неудобно, и стоит установить Common Name, например, в FQDN имя OpenVPN сервера. Дополнительно запрашиваемые challenge password и optional company name оставьте пустыми.

root@router1 /etc/openvpn/easy-rsa # ./build-key-server router1.example.com
Generating a 1024 bit RSA private key
.................++++++
.........++++++
writing new private key to 'router1.example.com.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [YourProvince]:
Locality Name (eg, city) [YourCity]:
Organization Name (eg, company) [YourCompany]:
Organizational Unit Name (eg, section) [OrganisationUnit]:
Common Name (eg, your name or your server's hostname) [router1.example.com]:
Name [KeyName]:router1.example.com
Email Address [mail@example.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'YourProvince'
localityName          :PRINTABLE:'YourCity'
organizationName      :PRINTABLE:'YourCompany'
organizationalUnitName:PRINTABLE:'OrganisationUnit'
commonName            :PRINTABLE:'router1.example.com'
name                  :PRINTABLE:'router1.example.com'
emailAddress          :IA5STRING:'mail@example.com'
Certificate is to be certified until Jan 31 21:33:25 2022 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

В результате будет создано три файла router1.example.com.csr c кодом запроса сертификата, router1.example.com.key с приватным ключом сертификата и router1.example.com.crt с выпущенным сертификатом. Также важно убедится, что файл с приватным ключом доступен на чтение только для root. Это ключ и сертификат сервера OpenVPN.

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

Сертификаты клиентов выпускаются аналогично:

./build-key client1

вместо client1 укажите уникальный идентификатор клиентского подключения. Каждое клиентское подключение должно иметь свой уникальный ключ с уникальным именем. Вся остальная информация может быть одинаковой. Пользователей можно будет добавить в любое время.

root@router1 /etc/openvpn/easy-rsa # ./build-key user_office2
Generating a 1024 bit RSA private key
...++++++
...............................++++++
writing new private key to 'user_office2.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [YourProvince]:
Locality Name (eg, city) [YourCity]:
Organization Name (eg, company) [YourCompany]:
Organizational Unit Name (eg, section) [OrganisationUnit]:
Common Name (eg, your name or your server's hostname) [user_office2]:
Name [KeyName]:user_office2
Email Address [mail@example.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'YourProvince'
localityName          :PRINTABLE:'YourCity'
organizationName      :PRINTABLE:'YourCompany'
organizationalUnitName:PRINTABLE:'OrganisationUnit'
commonName            :T61STRING:'user_office2'
name                  :T61STRING:'user_office2'
emailAddress          :IA5STRING:'mail@example.com'
Certificate is to be certified until Jan 31 21:50:09 2022 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

В результате будет создано три файла user_office2.csr c кодом запроса сертификата, user_office2.key с приватным ключом сертификата и user_office2.crt с выпущенным сертификатом. Также важно убедится, что файл с приватным ключом доступен на чтение только для root. Это ключ и сертификат клиента сервера OpenVPN.

Генерация Diffie Hellman параметров

Diffie Hellman параметры определяют метод авторизации и обмена ключами используемый OpenVPN сервером. Следующая команда создает эти параметры:

./build-dh

И да, это может длиться относительно долго.

root@router1 /etc/openvpn/easy-rsa # ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.........+............+.............................................................
...................+............................................................+...
.......................+............................................................
..............+...............+.....................................................
.............+................+.............................................+.......
.............................+..................................+...................
........................................................+........................+..
+.................................+....................................+............
.................................................................+..................
.............................................+...+..................................
...............+....................................................................
....................................................................................
.............................++*++*++*

Перемещение ключей

Все созданные ключи и сертификаты сейчас находятся в каталоге /etc/openvpn/easy-rsa/keys/ . Их необходимо переместить.

Серверу OpenVPN понадобится сертификат центра сертификации, сертификат и ключ сервера а также параметры Diffie Hellman. В случае вышеописанного примера, это файлы:

ca.crt
dh1024.pem
router1.example.com.crt
router1.example.com.key

Эти файлы необходимо скопировать в каталог /etc/openvpn/ на этом же хосте:

cd /etc/openvpn/easy-rsa/keys
cp ca.crt dh1024.pem router1.example.com.crt router1.example.com.key /etc/openvpn

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

ca.crt
user_office2.crt
user_office2.key

Обратите внимание, приватный ключ центра сертификации копировать не следует! Мало того, в случае если произойдет утечка приватного ключа центра сертификации, то будет необходимо перевыпустить все сертификаты.
Продолжение: Настройка сервера и клиента OpenVPN.

Подробнее Linux
1 отзыв Ваш отзыв
  1. client 035004706
    Май 15 2014

    В openvpn.conf раскомментировать нужный сервер для подключения и обновить линию «прото»:
    -TCP, когда порт 443 используется
    -UDP, когда порт 123 используется

    Ответить

Поделитесь своими мыслями, оставьте комментарий.

(required)
(required)

Внимание: HTML допускается. Ваш e-mail никогда не будет опубликован.

Подписка на комментарии

Captcha * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.