OpenVPN — популярный сервер для создания VPN-туннелей использующих аутентификацию и шифрование на основе протокола SSL/TLS. Туннели очень часто с одной стороны заканчиваются Mikrotik’ом и логичнее пожалуй генерировать сертификаты «не отходя от кассы», но в случае если туннелей и микротов много, считаю что лучше воспользоваться общим центром сертификации. В этом случае на помощь приходит Easy-RSA. На текущий момент версия 3. Скачать последний релиз можно на Github-странице проекта или установить из репозиториев Ubuntu (18 и выше) и Debian (10 и выше). Я предпочитаю гитхаб.
Создаем центр сертификации
Скачиваем и распаковываем последнию версию пакета. Изменяем рабочую папку на папку приложения и… С дефолтными настройками Easy-RSA готов к работе, но если вы хотете добавить чуть больше подробностей в сертификат необходимо внести правки в файл конфига vars
cp vars.example vars
Откроем файл vars на редактирование и найдем опцию EASYRSA_DN, она предусматривает два режима: упрощенный cn_only, при котором сертификат содержит только CN (имя того, кому выдан сертификат) и стандартный org, при котором заполняются все реквизиты организации. Для OpenVPN можно использовать любой режим. Я выбираю org, после чего убираем # со следующих строк и вносим свои данные:
set_var EASYRSA_DN "org"
# если вы выбрали cn_only, то редактировать
# нижеуказанные переменные нет смысла
set_var EASYRSA_REQ_COUNTRY "UA"
set_var EASYRSA_REQ_PROVINCE "21"
set_var EASYRSA_REQ_CITY "Kharkiv"
set_var EASYRSA_REQ_ORG "MY.ORG.UA"
set_var EASYRSA_REQ_EMAIL "me@example.net"
set_var EASYRSA_REQ_OU "peer-network"
Переменная EASYRSA_KEY_SIZE указывает размер ключа, на текущий момент стандартным считается размер начиная с 2048, если нам нужна безопасность — можем увеличить его до 3072 или 4096, но нагрузка на процессор возрастет, а пропускная способность будет ниже. Если же криптографическая стойкость не играет роли, а туннель будет использован для передачи не критичных данных, а также возможно использование слабых устройств, то стоит уменьшить размер до 1024. Осталяю по умолчанию
Переменные EASYRSA_CA_EXPIRE и EASYRSA_CERT_EXPIRE задают срок действия корневого сертификата CA и сертификатов пользователей (сервера и клиентов), устанавливаются в днях, по умолчанию это 3650 (10 лет) и 1080 (5 лет) дней, переменная EASYRSA_CERT_RENEW задает количество дней до истечения сертификата, когда становится доступным его продление, по умолчанию это 30 дней, устанавливаю в 60 и сохраняю файл/
Пришло время инициализировать центр сертификации. Данное действо выполняется один раз и при повторном вводе команды существующий CA будет перевыпущен и прийдется перевыпускать все ключи и сертификаты.
./easyrsa init-pki
Cоздаём файл для генерации случайных данных:
touch pki/.rnd
и активируем наш CA:
./easyrsa build-ca
При создании CA будет предложено ввести пароль — вводим, ибо закрытый ключ — основа инфраструктуры открытых ключей и при его компрометации прийдется начинать все заново. Также указываем собственное название центра сертификации в опции Common Name.
Результатом выполнения этих команд является создание структуры директорий CA, публичный сертификат центра сертификации ca.crt можно найти в папке pki, а закрытый ключ ca.key в pki/private. Закрытый ключ является секретным и не должен покидать свое расположение, доступ для других групп и пользователей к закрытому ключу также следует ограничить.
Сформируем файл параметров Диффи-Хеллмана dh.pem, он тоже будет в папке pki:
./easyrsa gen-dh
Центра сертификации (CA) создан.
Создаем ключ и сертификат для сервера
Сначала нужно создать запрос на сертификат:
./easyrsa gen-req main-server nopass
где:
- main-server — имя нашего ovpn сервера,
- nopass — указывает, что закрытый ключ следует создать без пароля.
При запуске команды будет создан запрос на сертификат и сгенерирован закрытый ключ сервера main-server.key, который будет располагаться в pki/private. Доступ к закрытому ключу также следует ограничить.
И выпускаем сертификат:
./easyrsa sign-req server main-server
Опция server обозначает выпуск сертификата для сервера. Для подтверждения выпуска нужно явно выразить свое согласие указав yes в ответ на соответствующий запрос, любый иные действия приведут к отмене действия. И потребуется ввести пароль от закрытого ключа центра сертификации.
Выпущенные сертификаты находятся в pki/issued.
Копируем необходимые сертификаты и ключи в папку с конфигом OpenVPN, предварительно создав там папку keys:
mkdir /etc/openvpn/keys
cp pki/ca.crt pki/dh.pem /etc/openvpn/keys
cp pki/private/ovpn-server.key pki/issued/ovpn-server.crt /etc/openvpn/keys
Создание ключа и сертификата для клиента
Также создаем запрос на сертификат:
./easyrsa gen-req point1 nopass
где:
- point1 — имя клиента
- nopass — говорит что создаем закрытый ключ без пароля.
Рекомендую давать клиентам понятные имена, чтобы ориентироваться кто находится за определенным соединением.
Выпускаем сертификат:
./easyrsa sign-req client point1
Используем опцию client для указания клиентского сертификата и подтверждаем действие указав пароль от закрытого ключа CA.
Для передачи клиенту необходимо скопировать в доступную клиенту папку/флешку закрытый ключ, сертификат клиента и сертификат CA.
Списки отзыва и отзыв сертификатов
При использовании OpenVPN для организации связи между офисами вряд ли у вас возникнет потребность в отзыве сертификата. Но, если мы предоставляем удаленный доступ к корпоративной сети, тут может возникнуть ситуацийя когда доступ отдельных лиц следует прекратить.
Создаём список отозванных сертификатов (CRL):
./easyrsa gen-crl
Затем символьную ссылку на список в папке с ключами OpenVPN:
ln -s /opt/easy-rsa/pki/crl.pem /etc/openvpn/keys/
И вносим в конфиг файл сервера OpenVPN строку:
crl-verify keys/crl.pem
После чего сервер OpenVPN нужно перезапустить.
И отзываем какой-либо сертификат:
./easyrsa revoke bad_cert
Где bad_cert — имя сертификата клиента (СN), после отзыва повторно публикуем список отозванных сертификатов:
./easyrsa gen-crl
Посмотреть список сертификатов можно командой:
cat pki/index.txt
Действующие сертификаты имеют статус V в начале строки, отозванные — R