Генерация RSA ключей для OpenVPN


Генерация RSA ключей для OpenVPN выполняется в несколько простых шагов.

Но прежде чем перейти к генерации ключей нам потребуется определиться с некоторыми моментами.
Нам нужны?

  • название CA ключа
  • название ключа сервера
  • название ключей клиентов
  • название организации (опционально)
  • e-mail (опционально)

При генерации клиентских ключей важно понять, что ключ клиента может быть либо “персональным” либо “совместным” одним на нескольких клиентов и даже одним на всех клиентов.

Вариант использования клиентского ключа определяется одной опцией в конфигурационном файле на OpenVPN сервере. Опция на сервере позволяет запретить или разрешить соединение с сервером если клиент с таким ключём уже соединился с сервером.

Чтобы выбрать вариант использования клиентского ключа нужно исходить из требований к VPN соединению. Выбирая какое количество ключей вам необходимо нужно помнить, что ключ привязаный к одному единственному клиенту даёт серверу возможность однозначно идентифицировать клиента и тем самым выдавать ему уникальный статический IP адрес, а также принимать и публиковать маршруты клиента. Публикация маршрутов клиента важна в том случае, когда вы хотите сделать доступными между собой разные сети соединённые через разные OpenVPN клиенты. Чтобы клиент из одной сети мог получить доступ к ресурсам из другой сети. С другой стороны “разделяемый” клиентский ключ при большом количестве клиентов порождает одну проблему. Предположим вы администрируете корпоративную VPN сеть. Один из сотрудников компании уволился и вам необходимо заблокировать ему доступ к корпоративной VPN сети. Для этого существует процедура отзыва ключа, которая даёт серверу информацию о том, что данный ключ перестал быть доверенным и соединения с таким клиентом устанавливать запрещено. Но “отозвав” один ключ вы одновременно заблокируете доступ всем VPN клиентам которые используют этот ключ. А если таких клиентов не один десяток то обновление ключей на всех клиентах превращается в проблему. Поэтому в случае больших сетей лучше выдавать “персональные” клиентские ключи.

Для управления сертификатами в поставке OpenVPN идут простые в использовании скрипты которые позволяют выполнить хитрые манипуляции с непонятными программами и их параметрами. Но прежде всего необходимо настроить эти скрипты.

Речь пойдёт о Linux конкретно Red Hat Fedora. У Fedora эти скрипты расположены в каталоге /usr/share/openvpn/easy-rsa/2.0/
Эти скрипты я обычно копирую в домашний каталог /home/user001/openvpn-easy-rsa/ и там манипулирую со скриптами.
Во первых, для генерации ключей не нужны права админа. Во вторых, для безопасности полученные приватные ключи нельзя показывать никому, а в родном каталоге они будут видны всем пользователям той машины где их генерировали. В третьих, я люблю чтобы всё было в рабочих каталогах.

Если кому-то не хочется вникать в описания команд, в самом конце страницы есть краткий список команд для генерации ключей. Настраивайте файлик vars и в путь.

Настройка скриптов

Откройте файл vars и измените следующие поля как вам нравится. Но они не могут быть пустыми. Так написано в документации :)

export KEY_SIZE=2048

export KEY_COUNTRY="CZ"
export KEY_PROVINCE="none"
export KEY_CITY="Praha"
export KEY_ORG="Moja organizatsija"
export KEY_EMAIL="ja@vse.chto.khotite"

Ограничение на длинну поля KEY_EMAIL – 40 символов.
на поле KEY_COUNTRY – 2 символа

ВАЖНО
Обратите внимание, если у вас отсутствует подкаталог keys или он пустой, без каких либо файлов (если вы ключи ещё не генерировали) то обязательно выполнение скрипла ./clean-all
Он делает два действия

  • Удаляет все из этого каталога. Осторожно! Он не спрашивает подтверждения
  • Создаёт в этом подкаталоге два файла
    keys/index.txt – пустой
    keys/serial – которые содержит одну строку 01 это будет серийный номер первого подписанного ключа.

Без этого при генерации серверных и клиентских ключей вы получите ошибки:

Using configuration from /home/user001/openvpn-easy-rsa/openssl.cnf
/home/user001/openvpn-easy-rsa/keys/index.txt: No such file or directory
unable to open '/home/user001/openvpn-easy-rsa/keys/index.txt'
3078002396:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/home/user001/openvpn-easy-rsa/keys/index.txt','r')
3078002396:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

или

Using configuration from /home/user001/openvpn-easy-rsa/openssl.cnf
/home/user001/openvpn-easy-rsa/keys/serial: No such file or directory
error while loading serial number
3078276828:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/home/user001/openvpn-easy-rsa/keys/serial','r')
3078276828:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

Генерация своего Certification Authoriry

Генерация своего собственного Certification Authoriry сокращённо (CA) выполняется при помощи скрипта build-ca.

Хочу предупредить, что не стоит запускать эти скрипты из под mc (Midnight Commander) потому что переменные из скрипта vars потеряются к запуску следующего скрипта. Запускайте всё из чистого shell.

[user001@m750 openvpn-easy-rsa]$ . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/user001/openvpn-easy-rsa/keys
[user001@m750 openvpn-easy-rsa]$ ./build-ca my-personal-ca
Generating a 2048 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) [CZ]:
State or Province Name (full name) [none]:
Locality Name (eg, city) [Praha]:
Organization Name (eg, company) [Moja organizatsija]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [my-personal-ca]:
Name []:
Email Address [ja@vse.chto.khotite]:

Генерация ключа сервера и подписание его своим CA

[user001@m750 openvpn-easy-rsa]$ ./build-key-server my-personal-vpn-server
Generating a 2048 bit RSA private key
...........................................+++
.+++
writing new private key to 'my-personal-vpn-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.
-----
Country Name (2 letter code) [CZ]:
State or Province Name (full name) [none]:
Locality Name (eg, city) [Praha]:
Organization Name (eg, company) [Moja organizatsija]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [my-personal-vpn-server]:
Name []:
Email Address [ja@vse.chto.khotite]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/user001/openvpn-easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CZ'
stateOrProvinceName   :PRINTABLE:'none'
localityName          :PRINTABLE:'Praha'
organizationName      :PRINTABLE:'Moja organizatsija'
commonName            :PRINTABLE:'my-personal-vpn-server'
emailAddress          :IA5STRING:'ja@vse.chto.khotite'
Certificate is to be certified until Aug 16 15:27:29 2021 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

Ключ Diffie Hellman

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

По причине того что я установил размер ключа 2048 бит генерация Diffie Hellman ключа будет идти долго.

[user001@m750 openvpn-easy-rsa]$ ./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.........................+......................................................
............+...................................................................
...............................................+................+...............
......................+...........+............+................................
......+....+....................................................................
................................................................................
................................................................................
........................................................................+.......
..................................................+.......+.....................
......+.........................................................................
................................................................................
..........................................................+.....................
.....................................+..........................................
...................................+............................................
................................................................................
.............................................++*++*

Я не стал цитировать полный экран так как в этом мало смысла.

Генерация необходимого количества ключей для клиентов.

Мне требуется 3 ключа для 3-х VPN клиентов. Действие повторю 3 раза меняя только имя передаваемое скрипту

[user001@m750 openvpn-easy-rsa]$ ./build-key my-personal-vpn-client1
Generating a 2048 bit RSA private key
................................................................................
...............................................................................+
++........................+++
writing new private key to 'my-personal-vpn-client1.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) [CZ]:
State or Province Name (full name) [none]:
Locality Name (eg, city) [Praha]:
Organization Name (eg, company) [Moja organizatsija]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [my-personal-vpn-client1]:
Name []:
Email Address [ja@vse.chto.khotite]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/user001/openvpn-easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CZ'
stateOrProvinceName   :PRINTABLE:'none'
localityName          :PRINTABLE:'Praha'
organizationName      :PRINTABLE:'Moja organizatsija'
commonName            :PRINTABLE:'my-personal-vpn-client1'
emailAddress          :IA5STRING:'ja@vse.chto.khotite'
Certificate is to be certified until Aug 16 15:54:18 2021 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
[user001@m750 openvpn-easy-rsa]$ ./build-key my-personal-vpn-client2
Generating a 2048 bit RSA private key
............+++
........+++
writing new private key to 'my-personal-vpn-client2.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) [CZ]:
State or Province Name (full name) [none]:
Locality Name (eg, city) [Praha]:
Organization Name (eg, company) [Moja organizatsija]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [my-personal-vpn-client2]:
Name []:
Email Address [ja@vse.chto.khotite]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/user001/openvpn-easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CZ'
stateOrProvinceName   :PRINTABLE:'none'
localityName          :PRINTABLE:'Praha'
organizationName      :PRINTABLE:'Moja organizatsija'
commonName            :PRINTABLE:'my-personal-vpn-client2'
emailAddress          :IA5STRING:'ja@vse.chto.khotite'
Certificate is to be certified until Aug 16 15:54:49 2021 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
[user001@m750 openvpn-easy-rsa]$ ./build-key my-personal-vpn-client3
Generating a 2048 bit RSA private key
.......+++
...+++
writing new private key to 'my-personal-vpn-client3.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) [CZ]:
State or Province Name (full name) [none]:
Locality Name (eg, city) [Praha]:
Organization Name (eg, company) [Moja organizatsija]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [my-personal-vpn-client3]:
Name []:
Email Address [ja@vse.chto.khotite]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/user001/openvpn-easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CZ'
stateOrProvinceName   :PRINTABLE:'none'
localityName          :PRINTABLE:'Praha'
organizationName      :PRINTABLE:'Moja organizatsija'
commonName            :PRINTABLE:'my-personal-vpn-client3'
emailAddress          :IA5STRING:'ja@vse.chto.khotite'
Certificate is to be certified until Aug 16 15:54:58 2021 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

И напоследок сделаем последний ключик для сервера и клиента. Он не обязателен, но его назначение предотвращать
перейдём в каталог с ключами и запустим такую команду (машина где она запускается должна иметь установленный openvpn

[user001@m750 keys]$ openvpn --genkey --secret ta.key

Выбираем файлы которые нужно скопировать на сервер, а какие на клиентов

Итак ключи сгенерированы. После генерации TA ключа мы остались в каталоге keys.

[user001@m750 keys]$ ls -l
total 136
-rw-rw-r--. 1 user001 user001 5348 Aug 19 17:27 01.pem
-rw-rw-r--. 1 user001 user001 5231 Aug 19 17:54 02.pem
-rw-rw-r--. 1 user001 user001 5231 Aug 19 17:54 03.pem
-rw-rw-r--. 1 user001 user001 5231 Aug 19 17:55 04.pem
-rw-rw-r--. 1 user001 user001 1623 Aug 19 17:09 ca.crt
-rw-------. 1 user001 user001 1704 Aug 19 17:09 ca.key
-rw-rw-r--. 1 user001 user001  424 Aug 19 18:40 dh2048.pem
-rw-rw-r--. 1 user001 user001  523 Aug 19 17:55 index.txt
-rw-rw-r--. 1 user001 user001   21 Aug 19 17:55 index.txt.attr
-rw-rw-r--. 1 user001 user001   21 Aug 19 17:54 index.txt.attr.old
-rw-rw-r--. 1 user001 user001  392 Aug 19 17:54 index.txt.old
-rw-rw-r--. 1 user001 user001 5231 Aug 19 17:54 my-personal-vpn-client1.crt
-rw-rw-r--. 1 user001 user001 1058 Aug 19 17:54 my-personal-vpn-client1.csr
-rw-------. 1 user001 user001 1708 Aug 19 17:54 my-personal-vpn-client1.key
-rw-rw-r--. 1 user001 user001 5231 Aug 19 17:54 my-personal-vpn-client2.crt
-rw-rw-r--. 1 user001 user001 1058 Aug 19 17:54 my-personal-vpn-client2.csr
-rw-------. 1 user001 user001 1704 Aug 19 17:54 my-personal-vpn-client2.key
-rw-rw-r--. 1 user001 user001 5231 Aug 19 17:55 my-personal-vpn-client3.crt
-rw-rw-r--. 1 user001 user001 1058 Aug 19 17:54 my-personal-vpn-client3.csr
-rw-------. 1 user001 user001 1708 Aug 19 17:54 my-personal-vpn-client3.key
-rw-rw-r--. 1 user001 user001 5348 Aug 19 17:27 my-personal-vpn-server.crt
-rw-rw-r--. 1 user001 user001 1058 Aug 19 17:27 my-personal-vpn-server.csr
-rw-------. 1 user001 user001 1704 Aug 19 17:27 my-personal-vpn-server.key
-rw-rw-r--. 1 user001 user001    3 Aug 19 17:55 serial
-rw-rw-r--. 1 user001 user001    3 Aug 19 17:54 serial.old
-rw-------. 1 user001 user001  636 Aug 19 18:41 ta.key

Ой! У неискушённого пользователя просто дух захватит от этого количества файлов. Что же выбрать?

Всё просто для сервера выбираем ключи:
ca.crt
dh2048.pem
ta.key
my-personal-vpn-server.crt
my-personal-vpn-server.key

Для клиента client1
ca.crt
ta.key
my-personal-vpn-client1.crt
my-personal-vpn-client1.key
И так далее…

Чтобы расставить все точки над I приведу табличку как это было на сайте OpenVPN.

Имя файла Требуется Назначение Секретный
ca.crt серверу и всем клиентам Root CA certificate нет
ca.key ключ требуется только для подписывания новосгенерированных ключей Root CA key ДА
dh2048.pem только серверу Diffie Hellman parameters нет
ta.key серверу и всем клиентам HMAC firewall ДА
my-personal-vpn-server.crt только серверу Server Certificate нет
my-personal-vpn-server.key только серверу Server Key ДА
my-personal-vpn-client1.crt только клиенту client1 Client1 Certificate нет
my-personal-vpn-client1.key только клиенту client1 Client1 Key ДА
my-personal-vpn-client2.crt только клиенту client2 Client2 Certificate нет
my-personal-vpn-client2.key только клиенту client2 Client2 Key ДА
my-personal-vpn-client3.crt только клиенту client3 Client3 Certificate нет
my-personal-vpn-client3.key только клиенту client3 Client3 Key ДА

Резюме

кратко список команд такой:

[user001@m750 openvpn-easy-rsa]$ . ./vars
[user001@m750 openvpn-easy-rsa]$ ./build-ca my-personal-ca
[user001@m750 openvpn-easy-rsa]$ ./build-dh
[user001@m750 openvpn-easy-rsa]$ ./build-key-server my-personal-vpn-server
[user001@m750 openvpn-easy-rsa]$ ./build-key my-personal-vpn-client1
[user001@m750 openvpn-easy-rsa]$ ./build-key my-personal-vpn-client2
[user001@m750 openvpn-easy-rsa]$ ./build-key my-personal-vpn-client3
[user001@m750 keys]$ openvpn --genkey --secret ta.key

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

Leave a Reply