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

openvpn vpn build-key

Сервер крутится на ВМ c ip-адресом 192.168.96.216

Ключи клиента создаются на сервере в каталоге /etc/openvpn/easy-rsa/2.0

cd /etc/openvpn/easy-rsa/2.0
Загружаем переменные
source vars

Создаем ключ клиента

В данном примере название ключа - andy (совпадает с именем клиента). Каждый ключ должен быть со своим именем.

./build-key andy

Для защиты ключа паролем другая команда

./build-key-pass andy
Далее надо копировать ключи (ca.crt, andy.crt, andy.key, ta.key) на клиента OpenVPN, и создать файл с конфигурацией, например omega-andy.ovpn

client
dev tun
proto tcp
remote vpn.gkomega.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca    ca.crt
cert    andy/andy.crt
key    andy/andy.key
ns-cert-type server
comp-lzo
verb 3

Маршрутизация

Для прокладки маршрутов к нужным сетям необходимо создать файл с именем клиента (ключа) в папке /etc/openvpn/ccd/andy

# client LAN access route
push "route 192.168.0.0 255.255.255.0"
push "route 192.168.96.0 255.255.255.0"
push "route 192.168.100.0 255.255.255.0"
push "route 192.168.102.0 255.255.255.0"
push "route 192.168.103.0 255.255.255.0"
push "route 192.168.104.0 255.255.255.0"
push "route 192.168.105.0 255.255.255.0"
push "route 10.0.2.0 255.255.255.0"
push "route 10.0.10.0 255.255.255.0"

Отзыв сертификата

Последовательность действий при отзыве сертификата:

cd /etc/openvpn/easy-rsa/2.0
source vars
./revoke-full andy

В результате видим примерно следующее:

Using configuration from /usr/local/etc/openvpn/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Revoking Certificate 04.
Data Base Updated

или

Using configuration from /usr/local/etc/openvpn/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
client2.crt: /C=RU/ST=NN/O=TEST/CN=andy/emailAddress=andy@gkomega.ru
error 23 at 0 depth lookup:certificate revoked

“error 23” в последней строке, указывающую на неудавшуюся попытку проверки отозванного сертификата.

Скрипт revoke-full как раз и создает CRL (certificate revocation list) - crl.pem. Этот файл (не является секретным) должен быть скопирован в каталог, видимый OpenVPN сервером, а путь к нему прописан в конфиге server.conf.

crl-verify /etc/openvpn/revoke/crl.pem

Теперь при подключении, все клиентские сертификаты будут проверяться на наличие в CRL, и если таковое будет найдено, в соединении будет отказано.
При использовании crl-verify в OpenVPN, CRL-файл перечитывается по умолчанию каждый час.
Таким образом, если в момент добавления сертификата в исключения, клиент уже установил связь, то он будет продолжать работу. Чтобы изменения применились наверняка перезапустите демон OpenVPN сервера.

При отзыве сертификата бывает ещё ошибка такого вида:

error on line 282 of config file '....openvpn/easy-rsa/openssl.cnf'

Решается комментированием следующих строчек в openssl.cnf:

#[ pkcs11_section ]
#engine_id = pkcs11
#dynamic_path = /usr/lib/engines/engine_pkcs11.so
#MODULE_PATH = $ENV::PKCS11_MODULE_PATH
#PIN = $ENV::PKCS11_PIN
#init = 0

Возможно сгенерировать новую пару сертификат/ключ с тем же именем, как у отозванного ранее сертификата.
Например в случае, когда пользователь забыл свой пароль на предыдущий сертификат, и его отозвали по этой причине.

Просмотр отозванных сертификатов:

cat /etc/openvpn/easy-rsa/2.0/keys/index.txt | grep -vE "^V|^$"