Генерация 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
В другой статье я опишу конфигурацию сервера и клиента чтобы они использовали полученные ключи.