Генерация PKI сертификатов для OpenVPN



Так выглядит инфраструктура PKI. Во главе должен быть корневой центр сертификации (Root CA) со списком отзыва сертификатов (CLR). Root CA выдает клиентские и серверные сертификаты. Полномочия по выдаче сертификатов может быть передано подчиненному промежуточному центру сертификации со своим списком отзыва сертификатов. Возможно создание нескольких промежуточных центров сертификации. Принцип работы следующий:

  1. создается сертификат корневого\промежуточного центра сертификации (ca.crt), этот сертификат распространяется на все хосты, где будут использоватся сертификаты, подписанные этим центром сертификации.
  2. создается список отзыва сертификатов (crl.pem). При каждом обновлении списка, файл отзыва нужно копировать на хост, который проверяет сертификаты клиентов
  3. содается запрос на сертификат (QSR), по сути это идентификационные данные владельца, которому будет выписан сертификат. QSR нужен только при создании сертификата. Сформировать QSR можно на любом хосте, либо сразу указывать данные при создании сертификата.
  4. создается подписанный сертификат (host.crt) и приватный ключ (private.key). Эти файлы размещаются на хосте, для которого был сгенерирован сертификат.

Для управления PKI существует утилита Easy-RSA Рассмотрим процесс создания PKI Качаем и устанавливаем утилиту

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.zip
unzip -d /usr/local/share EasyRSA-3.0.3.zip

Создаем и редактируем конфигурационный файл

cd cd /usr/local/share/EasyRSA-3.0.3
mkdir -p root_ca
cp vars.example vars
root@localhost:/usr/local/share/EasyRSA-3.0.3 # grep set_var vars | grep -v "#"
set_var EASYRSA                 "$PWD/root_ca"
set_var EASYRSA_PKI             "$EASYRSA/pki"
set_var EASYRSA_REQ_COUNTRY     "UA"
set_var EASYRSA_REQ_PROVINCE    "Kiev"
set_var EASYRSA_REQ_CITY        "Kiev"
set_var EASYRSA_REQ_ORG         "AH Co"
set_var EASYRSA_REQ_EMAIL       "[email protected]"
set_var EASYRSA_REQ_OU          "IT"
set_var EASYRSA_CA_EXPIRE       365
set_var EASYRSA_CERT_EXPIRE     365

Все структура ключей будет находиться по пути «$PWD/root_ca«, куда нужно скопировать папку со всеми x509 типами сертификатов и openssl конфигурационный файл.

cp openssl-1.0.cnf root_ca/
cp x509-types root_ca/

Инициализируем структуру pki

./easyrsa init-pki

Создаем root CA сертификат. По умолчанию, все приватные ключи будут запаролены, пароль нужно будет указывать при создании ключа, и каждый раз при его использовании. Это секьюрно, но не практично. Мы будем создавать не запароленные приватные ключи, для этого нужна опция nopass

./easyrsa build-ca nopass

Создаем CRL для отзыва сертификатов

./easyrsa gen-crl

Создаем сертификат для OpenVPN сервера

./easyrsa build-server-full vpn-server nopass

Создаем сертификат для OpenVPN клиента

./easyrsa build-client-full vpn-client nopass

Отозвать сертификат нужно так, обязательно скопировать обновленный crl.pem файл на OpenVPN сервер.

./easyrsa revoke vpn-client
./easyrsa gen-crl

Структура выглядит таким образом

root@localhost:/usr/local/share/EasyRSA-3.0.3 # tree root_ca/
root_ca/
|-- openssl-1.0.cnf
|-- pki
|   |-- ca.crt
|   |-- certs_by_serial
|   |   |-- 1E10E1AA682F665A5A2FD161EEC06703.pem
|   |   `-- EDBCAA112657486724EA18592F24360B.pem
|   |-- crl.pem
|   |-- index.txt
|   |-- index.txt.attr
|   |-- index.txt.attr.old
|   |-- index.txt.old
|   |-- issued
|   |   |-- vpn-client.crt
|   |   `-- vpn-server.crt
|   |-- private
|   |   |-- ca.key
|   |   |-- vpn-client.key
|   |   `-- vpn-server.key
|   |-- reqs
|   |   |-- vpn-client.req
|   |   `-- vpn-server.req
|   |-- serial
|   `-- serial.old
`-- x509-types
    |-- COMMON
    |-- ca
    |-- client
    |-- san
    `-- server

Файлы ca.crt,vpn-server.key,vpn-server.crt копируем на OpenVPN сервер
Файлы ca.crt,vpn-client.key,vpn-client.crt копируем на OpenVPN клиент