В роутерах серии RTU есть возможность использования защищенного соединения через частную виртуальную сеть, под названием OpenVPN

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

Практически всю часть конфигурирования  можно произвести через WEB интерфейс, но некоторые элементы все же придется произвести через консоль!

Что такое OpenVPN и для чего он необходим можно ознакомиться в статье: OpenVPN


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


1. Генерация сертификатов и ключей на Windows 

Для генерации сертификатов и ключей шифрования на ОС Windows необходимо установить само приложение OpenVPN.

Скачать последнюю версию OpenVPN для ОС Windows можно по ссылке: https://openvpn.net/community-downloads/.

После скачивания и установки в указанную Вами папку в ней будет список файлов, по умолчанию OpenVPN устанавливается в директорию C:\Program Files\OpenVPN.

Для генерации ключей будем использовать easy-rsa. Необходимо запустить командную строку от имени администратора и перейти в директорию с папкой easy-rsa. В примере используем команду для перехода в папку по умолчанию, у Вас данный путь может отличаться.

cd C:\Program Files\OpenVPN\easy-rsa 


1.1 Запускаем файл init-config.bat

C:\Program Files\OpenVPN\easy-rsa>init-config.bat                
C:\Program Files\OpenVPN\easy-rsa>copy vars.bat.sample vars.bat  
Скопировано файлов:         1.                                   


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

Мы подставили свои параметры, у Вас данные параметры будут другие.

set KEY_COUNTRY=RU
set KEY_PROVINCE=Moscow
set KEY_CITY=Moscow
set KEY_ORG=TELEOFIS
set KEY_EMAIL=support@teleofis.ru
set KEY_CN=server
set KEY_NAME=server
set KEY_OU=server
set PKCS11_MODULE_PATH=server
set PKCS11_PIN=12345

Там где написано server, не трогаем. Сохраняем файл.


1.2 Редактируем файл openssl-1.0.0.cnf 

От имени администратора открываем блокнот, нам необходимо отредактировать файл openssl-1.0.0.cnf. По умолчанию данный файл находится в директории C:\Program Files\OpenVPN\easy-rsa, у Вас данный путь также может отличаться.

Нам необходимо найти строчку: 

default_days = 365

Далее необходимо заменить значение 365 на 3650, в более новых версиях OpenVPN значение 3650 может быть уже установлено по умолчанию.


1.3 Генерируем ключи и сертификаты

Подаем последовательно в консоль команды:

vars

clean-all


В ответ должно прийти

Скопировано файлов: 1.
Скопировано файлов:         1.


Если, мы это видим, значит все хорошо, продолжаем...


1.4 Создаем центр сертификации CA

Подаем команду:

build-ca


На данном моменте в некоторых случаях может возникнуть ошибка:


C:\Program Files\OpenVP

\easy-rsa>build-ca

"openssl" не является внутренней или внешней

командой, исполняемой программой или пакетным файлом.


Для устранения ошибки открываем файл vars.bat от имени администратора и ищем строку 

rem set "PATH=%PATH%;C:\Program Files\OpenVPN\bin"

Удаляем rem, после чего данная строка должна принять вид:

set "PATH=%PATH%;C:\Program Files\OpenVPN\bin"

Сохраняем, далее снова подаем последовательно команды

vars

clean-all

В ответ должно прийти

Скопировано файлов: 1.
Скопировано файлов: 1.

Подаем команду:

build-ca


При генерации основного сертификата в консоли будут отображаться вопросы. Просто нажимаем Enter, т.к. все эти параметры мы ввели в файле vars.bat

Нажимаем Enter до тех пор, пока не отобразиться строка приглашения

C:\Program Files\OpenVPN\easy-rsa


1.5 Создаем ключ Диффи-Хелмана

Данный шаг не является обязательным, ключ Диффи-Хелмана необходим для реализации одноименного протокола 

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


В применении к OpenVPN файл Диффи-Хелмана нужен для обеспечения защиты трафика от расшифровки, если ключи были похищены. Здесь имеется в виду тот трафик, который был записан и сохранен еще до похищения ключей.


Файл Диффи-Хелмана создается на сервере OpenVPN.


Для создания ключа необходимо подать команду:

build-dh


1.6 Создаем сертификат и ключ сервера

Подаем команду:

     build-key-server server


На вопросы нажимаем Enter, но не торопимся, в самом конце будет задано два вопроса

Sign the certificate?

1 out of 1 certificate requests certified, commit?


На оба эти вопроса отвечаем Y


1.7 Создаем сертификат и ключ клиента

Подаем команду:

build-key-client 


Также не торопимся с ответами, как только увидим строку "Common Name (eg, your name or your server's hostname)" нужно ответить client.

В самом конце также будут два вопроса, отвечаем также Y

Причем: для каждого клиента, нужно будет создать отдельные ключи и называть их client1, client2 или как-то иначе, все зависит от Вашего воображения. 

Например:

build-key client1

build-key office1


На этом создание файлов сертификатов и ключей завершено.

Все файлы будут лежать в папке C:\Program Files\OpenVPN\easy-rsa\keys\


2. Генерация сертификатов и ключей на Linux 

Генерация сертификатов и ключей будет осуществляться на ОС Ubuntu Linux 20.04. 

Для других систем на базе Linux, некоторые команды могут отличаться!


Первоначально необходимо обновить все пакеты ОС Linux, подаем в консоль команду:

sudo apt-get update

sudo apt-get upgrade


Установим пакет zip, если он не был установлен ранее:

sudo apt install zip


2.1  Установка утилиты Easy-RSA

Создадим нового пользователя ca и переведем его в домашний каталог:

sudo adduser ca


В ответ система выведет информацию и попросит ввести пароль:

Adding user 'ca' ...
Adding new group 'ca' (1002) ...
Adding new user 'ca' (1002) wuth group 'ca' ...
Creating home directory '/home/ca' ...
Coping files from '/etc/skel/' ...
New password:


Вводим пароль, затем еще раз его повторяем, если все хорошо, система выведет следующую информацию:

passwd: password updated successfully
Changing the user information for ca
Enter the new value or press ENTER for the default
Full name []:
Room number []:
Work phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]


Нажимаем Y, пользователь успешно создан.


Делаем loging под пользователя ca:

     su ca

cd


Далее необходимо загрузить дистрибутив программы утилитой wget:

wget https://github.com/OpenVPN/easy-rsa/archive/master.zip 


Распаковываем архив:

$ unzip master.zip 


2.2 Создаем инфраструктуру публичных PKI, создание центра сертификации СА:

Создадим инфраструктуру публичных ключей (Public Key Infrastructure, PKI): 

cd /home/ca/easy-rsa-master/easyrsa3 

$ ./easyrsa init-pki 


В ответ система оповестит, что PKI создан успешно:

init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/ca/easy-rsa-master/easyrsa3/pki 


Далее создаем удостоверяющий центр сертификации:

$ ./easyrsa build-ca 


В ответ система выдаст сообщение следующего вида:

Generating RSA private key, 2048 bit long modulus (2 primes)
..................................................................................+++++
......................................................+++++
e is 65537 (0x010001)
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]:ca

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


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


В конечном итоге у нас создадутся в системе два файла, которые нам в дальнейшем пригодятся: ca.crt и ca.key. Данные файлы находятся в директориях:

/home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key 
/home/ca/easy-rsa-master/easyrsa3/pki/ca.crt 


Файл ca.key является секретным, его нельзя передавать на другие узлы Вашей сети.

Файл ca.crt открытый, его необходимо передавать на узлы серверов и клиентов сети OpenVPN. 


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

Если сотрудник уволился из компании и у него есть доступ в сети VPN компании, нам необходимо закрыть этот доступ путем отзыва сертификата CRL. Для создания сертификата проделаем следующее:

cd /home/ca/easy-rsa-master/easyrsa3 
$ ./easyrsa gen-crl 


Система запросит пароль для доступа к закрытому ключу ca.key. Список отзыва сертификатов будет доступен в файле crl.pem:

/home/ca/easy-rsa-master/easyrsa3/pki/crl.pem 

Данный сертификат передается OpenVPN серверу. Также в конфиге сервера должен быть прописан путь до crl.pem, как правило данное правило прописывается в server.conf.


crl-verify /usr/local/etc/openvpn/crl.pem


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

$ ./easyrsa revoke test 


В таблице ниже описана структура каталога PKI:


Файл или каталог
Описание
ca.crtСертификат удостоверяющего центра, передается как на сервер OpenVPN, так и на клиент OpenVPN
crl.pemСписок отзыва сертификатов CRL
issuedКаталог с сертификатами, созданными центром сертификации СА
privateКаталог с секретными ключами
ReqsКаталог запросов на сертификаты


2.4 Установка OpenVPN, создание каталога для конфигурации клиентов

Процесс создания сервера OpenVPN включает в себя установку пакета OpenVPN, создание сертификатов и ключей, а также подготовку рабочей конфигурации.


Установим пакет OpenVPN:

$ sudo apt-get install openvpn


Первоначально необходимо подготовить файлы конфигурации openssl.cnf и server.conf. Первый файл определяет конфигурацию OpenSSL, второй файл определяет конфигурацию сервера OpenVPN.


В комплекте с утилитой Easy-RSA поставляется пример файла конфигурации OpenSSL. Если Вы делали все действия по данному гайду, данный файл будет находиться по пути:

/home/ca/easy-rsa-master/easyrsa3/openssl-1.0.cnf 


По умолчанию файл openssl-1.0.cnf содержит в себе следующую информацию:

# For use with Easy-RSA 3.0+ and OpenSSL or LibreSSL

####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section

####################################################################
[ CA_default ]

dir             = $ENV::EASYRSA_PKI     # Where everything is kept
certs           = $dir                  # Where the issued certs are kept
crl_dir         = $dir                  # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/certs_by_serial  # default place for new certs.

certificate     = $dir/ca.crt           # The CA certificate
serial          = $dir/serial           # The current serial number
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/ca.key   # The private key
RANDFILE        = $dir/.rand            # private random number file

Чтобы запуск сервера OpenVPN прошел успешно, необходимо создать каталоги, в которых будут храниться сертификаты и ключи для сервера и клиентов OpenVPN:


Создадим каталог для конфигурации клиентов:

$ sudo mkdir /etc/openvpn/ccd


2.5 Подготовка сертификатов и ключей для сервера OpenVPN

Для организации OpenVPN нам потребуются файлы, перечисленные в таблице ниже:

ФайлОписание
dh.pemКлюч Диффи-Хелмана, используется для защиты трафика от расшифровки, необходимо загружать как на клиент, так и на сервер (опционально)
ca.crtСертификат удостоверяющего центра CA, необходимо загружать на сервер и клиент OpenVPN
server.crtСертификат сервера OpenVPN, необходимо загружать на сервер OpenVPN
server.keyПриватный ключ сервера, секретный, необходимо загружать на сервер OpenVPN
crl.pemCписок отзыва сертификатов CRL, необходимо загружать на сервер (опционально)
ta.keyКлюч HMAC для дополнительной защиты от DoS-атак и флуда (опционально)
client.crtСертификат клиента OpenVPN, необходимо загружать на клиент OpenVPN
client.keyПриватный ключ клиента, секретный, необходимо загружать на клиента OpenVPN


Так как центр сертификации мы уже сгенерировали, на следующем этапе сгенерируем сертификат и приватный ключ для сервера OpenVPN.

$ cd /home/ca/easy-rsa-master/easy-rsa3/

$ ./easyrsa gen-req server


В процессе создания, система запросит пароль, а также имя Common Name для сервера OpenVPN:

Generating a RSA private key
.+++++
.......+++++
writing new private key to '/home/ca/easy-rsa-master/easyrsa3/pki/easy-rsa-2258.QFUIV0/tmp.WadIoG'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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]:server

Keypair and certificate request completed. Your files are:
req: /home/ca/easy-rsa-master/easyrsa3/pki/reqs/server.req
key: /home/ca/easy-rsa-master/easyrsa3/pki/private/server.key

Если же Вы хотите создать данные файлы без защиты паролем, используем команды:

$ cd /home/ca/easy-rsa-master/easy-rsa3/

$ ./easyrsa gen-req server nopass 


Таким образом, в системе создадутся два файла: server.req и server.key, первый из них является открытым, его необходимо будет в дальнейшем подписать удостоверяющим центром СА, второй является секретым, его необходимо хранить на сервере OpenVPN.


Следующим шагом необходимо подписать данный сертификат (server.req) на стороне удостоверяющего центра СА:

$ ./easyrsa sign-req server server


При создании сертификата система запросит пароль (если при формировании server.req сертификат создавался с паролем).  Необходимо будет ответить на сообщение yes, после чего ввести пароль от сертификата server.req. После успешного создания сертификата, система также уведомит об этом.

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 825 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/ca/easy-rsa-master/easyrsa3/pki/easy-rsa-2714.b10rbG/tmp.y76kMH
Enter pass phrase for /home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Oct 19 13:09:57 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/ca/easy-rsa-master/easyrsa3/pki/issued/server.crt

Отлично! Теперь необходимо загрузить на сервер OpenVPN сертификат server.crt, который был только что создан, а также ключ server.key.

По умолчанию и ключ находятся в следующих директориях:

/home/ca/easy-rsa-master/easyrsa3/pki/issued/server.crt  
/home/ca/easy-rsa-master/easyrsa3/pki/private/server.key

2.6 Подготовка сертификатов и ключей для клиента OpenVPN

Генерировать сертификат будем под пользователем ca:

su ca

cd /etc/home/ca/easy-rsa-master/easy-rsa3

./easyrsa gen-req client nopass


Если к защите данных предъявляются повышенные требования, сертификат можно создать с паролем:

./easyrsa gen-req client


Далее система попросит ввести Common Name, я назову данный сертификат client1, после генерации ключа система дополнительно оповестит нас об этом:

Generating a RSA private key
....................................................................+++++
........................+++++
writing new private key to '/home/ca/easy-rsa-master/easyrsa3/pki/easy-rsa-2221.ChEcsT/tmp.gWTNPO'
-----
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]:client1

Keypair and certificate request completed. Your files are:
req: /home/ca/easy-rsa-master/easyrsa3/pki/reqs/client.req
key: /home/ca/easy-rsa-master/easyrsa3/pki/private/client.key

Таким образом, в системе создадутся два файла: client.req и client.key, первый из них является открытым, его необходимо будет в дальнейшем подписать удостоверяющим центром СА, второй является секретым, его необходимо будет в дальнейшем загрузить на клиент OpenVPN.


Далее необходимо только что созданный сертификат client.req подписать в удостоверяющем центре СА:

./easyrsa sign-req client client


При создании сертификата система запросит пароль (если при формировании server.req сертификат создавался с паролем).  Необходимо будет ответить на сообщение yes, после чего ввести пароль от сертификата client.req. После успешного создания сертификата, система также уведомит об этом.

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 825 days:

subject=
    commonName                = client1


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/ca/easy-rsa-master/easyrsa3/pki/easy-rsa-2951.3DJoCJ/tmp.AqABm4
Enter pass phrase for /home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client1'
Certificate is to be certified until Oct 20 07:26:18 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/ca/easy-rsa-master/easyrsa3/pki/issued/client.crt

Отлично! Теперь необходимо загрузить на клиент OpenVPN сертификат client.crt, который был только что создан, а также ключ client.key.

По умолчанию и ключ находятся в следующих директориях:

/home/ca/easy-rsa-master/easyrsa3/pki/private/client.key
/home/ca/easy-rsa-master/easyrsa3/pki/issued/client.crt

2.7  Создаем ключ Диффи-Хелмана

 Для генерации ключа Диффи-Хелмана будем использовать команду:

$ cd /home/ca/easy-rsa-master/easy-rsa3/

$ ./easyrsa gen-dh


Создание ключа Диффи-Хелмана может занять достаточно продолжительное время, по окончании данного процесса система оповестит об этом:

DH parameters of size 2048 created at /home/ca/easy-rsa-master/easyrsa3/pki/dh.pem

Данный ключ находится в директории:

/home/ca/easy-rsa-master/easyrsa3/pki/dh.pem

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

Для создания ключа HMAC используется команда openvpn с опциями --genkey и --secret. Данный ключ необходимо создавать не от обычного пользователя, а от пользователя с правами администратора.

cd /etc/openvpn

su teleofis

Система попросит ввести пароль от админской учетки, после ввода пароля необходимо выдать себе права на владение:

sudo chown -R teleofis:teleofis .

openvpn --genkey --secret ta.key


Ключ сгенерирован, он будет находиться в директории:

/etc/openvpn/ta.key


На этом моменте создание сертификатов закончено, далее переходим к следующей статье:
OpenVPN режим мультиклиента: Часть 2 - Настройка RTU сервера (tun)


Сопутствующие статьи:
Как подключиться к роутеру RTU?

Описание WEB-интерфейса роутера RTU


Дополнительная информация: 

Wiki на GitHub