Первый шаг в построении конфигурации OpenVPN заключается в создании инфраструктуры открытых ключей (Public Key Infrastructure, PKI). PKI состоит из:
- отдельного сертификата (также известного как открытый ключ) и секретного ключа для каждого сервера и клиента, и
- главного сертификата центра сертификации (Certificate Authority, CA) и ключа, который используется для подписи каждого сертификата для сервера и клиентов.
OpenVPN поддерживает двунаправленную аутентификацию на основе сертификатов, это означает что клиент должен проверять подлинность сертификата сервера, а сервер должен проверять подлинность сертификата клиента до того как они начнут доверять друг другу.
И сервер и клиент будет аутентифицировать друг друга, сначала проверив что представленный сертификат подписан центром сертификации (CA), а затем путем проверки информации в заголовках уже аутентифицированного сертификата, таких как «common name» сертификата и тип сертификата (клиент или сервер).
Эта модель безопасности с точки зрения VPN имеет ряд желательных функций:
- Серверу необходим только свой сертификат/ключ — у него нет необходимости знать индивидуальные сертификаты каждого клиента, который может подключиться к нему.
- Сервер будет принимать только клиентов, чьи сертификаты были подписаны главным CA-сертификатом (который мы будем генерировать ниже). Поскольку сервер может выполнить эту проверку подписи без необходимости доступа непосредственно к закрытому ключу CA, есть возможность для CA-ключа (наиболее чувствительного ключа во всем PKI) находиться на совершенно другой машине, даже без сетевого подключения.
- Если закрытый ключ скомпрометирован, его можно отключить, добавив его сертификат к CRL (certificate revocation list, список отозванных сертификатов). CRL позволяет выборочно отклонять скомпрометированные сертификаты без необходимости перестройки всего PKI.
- Сервер может применять клиент-специфичные права доступа на основании встроенных областей сертификата, таких как Common Name.
Для создания и ведения инфраструктуры открытых ключей (PKI) в OpenVPN существует программа easy-rsa. Начиная с 2013-го года программа “easy-rsa” отсутствует в пакете с OpenVPN поэтому ее нужно установить отдельно. Она есть в репозиториях практически всех дистрибутивов Linux, однако лучше всего ее скачать с github.com:
$ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
Дистрибутив Easy-RSA содержит:
Файл или каталог | Описание |
COPYING | Информация о лицензии |
ChangeLog | Журнал изменений |
Licensing | Каталог с файлом текста лицензии |
README | Краткая информация о программе Easy-RSA |
README.quickstart.md | Краткое руководство по работе с Easy-RSA |
Build | Скрипт для создания дистрибутива |
Distro | Этот каталог содержит файлы для Windows |
Doc | Документация Easy-RSA |
easyrsa3 | Каталог с программой Easy-RSA |
release-keys | Ключ GPG Key ID, использованный для подписи дистрибутива |
Создаем инфраструктуру публичных ключей PKI
$ cd easy-rsa-master/easyrsa3 /easy-rsa-master/easyrsa3 $ ./easyrsa init-pki
В результате увидим:
init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/neogrig/easy-rsa-master/easyrsa3/pki
Далее создаем удостоверяющий центр для OpenVPN:
/easy-rsa-master/easyrsa3 $ ./easyrsa build-ca nopass
Последняя команда (build-ca) создаст сертификат и ключ центра сертификации (CA), вызвав интерактивную команду openssl:
Generating a 2048 bit RSA private key ...........................................................................+++ ...+++ writing new private key to '/home/neogrig/easy-rsa-master/easyrsa3/pki/private/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. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]:oslogic.ru
CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /home/ca/easy-rsa-master/easyrsa3/pki/ca.crt
Для удостоверяющего центра соданы ключ и сертификат:
/home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key /home/ca/easy-rsa-master/easyrsa3/pki/ca.crt
Теперь можно создавать и подписывать сертификаты. Для облегчения работы можно подправить файл параметров easy-rsa для того, чтобы меньше вводить информации. Для этого копируем файл vars.example в файл vars:
cp vars.example vars
и расскомментируем и правим в vars строчки:
#set_var EASYRSA_REQ_COUNTRY "US" #set_var EASYRSA_REQ_PROVINCE "California" #set_var EASYRSA_REQ_CITY "San Francisco" #set_var EASYRSA_REQ_ORG "Copyleft Certificate Co" #set_var EASYRSA_REQ_EMAIL "me@example.net" #set_var EASYRSA_REQ_OU "My Organizational Unit"
например так:
set_var EASYRSA_REQ_COUNTRY "RU" set_var EASYRSA_REQ_PROVINCE "Moscow" set_var EASYRSA_REQ_CITY "Moscow" set_var EASYRSA_REQ_ORG "My_firm" set_var EASYRSA_REQ_EMAIL "me@example.net" set_var EASYRSA_REQ_OU "Otdel_IT"
Создаем список отозванных сертификатов (изначально он пустой):
$ ./easyrsa gen-crl
Note: using Easy-RSA configuration from: ./vars Using configuration from /home/neogrig/easy-rsa-master/easyrsa3/openssl-1.0.cnf
An updated CRL has been created. CRL file: /home/neogrig/easy-rsa-master/easyrsa3/pki/crl.pem
Создаем ключи и запрос на сертификат сервера:
$ ./easyrsa gen-req server nopass
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key ............................................................................................................................+++ ...............................................................+++ writing new private key to '/home/neogrig/easy-rsa-master/easyrsa3/pki/private/server.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. ----- Common Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are: req: /home/neogrig/easy-rsa-master/easyrsa3/pki/reqs/server.req key: /home/neogrig/easy-rsa-master/easyrsa3/pki/private/server.key
Создаем и подписываем сертификат сервера:
$ ./easyrsa sign-req server server
Note: using Easy-RSA configuration from: ./vars
You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 3650 days:
subject= commonName = server
Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes Using configuration from /home/neogrig/easy-rsa-master/easyrsa3/openssl-1.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :PRINTABLE:'server' Certificate is to be certified until Nov 8 19:51:44 2025 GMT (3650 days)
Write out database with 1 new entries Data Base Updated
Certificate created at: /home/neogrig/easy-rsa-master/easyrsa3/pki/issued/server.crt
Создаем ключи Диффи-Хелмана:
$ ./easyrsa gen-dh
Note: using Easy-RSA configuration from: ./vars Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time .........................+.............................................................................................................................................................................+....................................................................................................................
..............................................................++*++*
DH parameters of size 2048 created at /home/neogrig/easy-rsa-master/easyrsa3/pki/dh.pem
Теперь для создания статического ключа HMAC необходимо установить openvpn:
$ sudo apt-get install openvpn $ sudo openvpn --genkey --secret ta.key
Все необходимые ключи и сертификаты для сервера созданы:
- ca.crt — cертификат удостоверяющего центра;
- server.crt — cертификат сервера OpenVPN;
- server.key — приватный ключ сервера OpenVPN;
- crl.pem — cписок отзыва сертификатов;
- dh.pem — файл Диффи-Хелмана для обеспечения защиты трафика от расшифровки;
- ta.key — ключ HMAC для дополнительной защиты от DoS-атак и флуда
Теперь можно создавать сертификаты для клиентов. Так-же создаем ключ и запрос сертификата:
$ ./easyrsa gen-req client nopass
Note: using Easy-RSA configuration from: ./vars Generating a 2048 bit RSA private key .............................................................................................................................+++ .......................................................................+++ writing new private key to '/home/neogrig/easy-rsa-master/easyrsa3/pki/private/client.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. ----- Common Name (eg: your user, host, or server name) [client]:
Keypair and certificate request completed. Your files are: req: /home/neogrig/easy-rsa-master/easyrsa3/pki/reqs/client.req key: /home/neogrig/easy-rsa-master/easyrsa3/pki/private/client.key
Создаем и подписываем сертификат:
$ ./easyrsa sign-req client client
Note: using Easy-RSA configuration from: ./vars
You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender.
Request subject, to be signed as a client certificate for 3650 days:
subject= commonName = client
Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes Using configuration from /home/neogrig/easy-rsa-master/easyrsa3/openssl-1.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :PRINTABLE:'client' Certificate is to be certified until Nov 8 21:54:25 2025 GMT (3650 days)
Write out database with 1 new entries Data Base Updated
Certificate created at: /home/neogrig/easy-rsa-master/easyrsa3/pki/issued/client.crt
Теперь и для клиента OpenVPN готовы все ключи и сертификат:
- ca.crt
- crl.pem
- ta.key
- client.key
- client.crt