Столкнулся с проблемой, когда клиенты не могут подключиться к openvpn серверу, запущенному на ubuntu server, при этом на сервере в логах openvpn постоянно сыпется ошибка:
WARNING: Failed to stat CRL file, not (re)loading CRL.
VERIFY ERROR: depth=0, error=CRL has expired: CN= название_клиента
И уж раз пришлось решать проблему, то 2 варианта её решения опишу здесь.
Все действия выполнялись на ubuntu server 20.04.
Вариант решения 1:
Смотрим в консоли ubuntu server:
cd /etc/openvpn/server
sudo openssl crl -inform PEM -in crl.pem -text -noout
вижу:
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm:
Issuer: CN = имя
Last Update: Jan 6 18:59:07 2021 GMT
Next Update: Jul 5 18:59:07 2021 GMT
Конфиг /etc/openvpn/server/server.conf службы openvpn содержит у меня строку:
crl-verify /etc/openvpn/server/crl.pem
которая как раз говорит о том, какие сертификаты отозваны. Если для вас не важно отзывать сертификаты клиентов, то в конфигурационном файле /etc/openvpn/server/server.conf закомментируйте строку выше и перезапустите службу openvpn, проблема должна устраниться. Если же важно блокировать подключение клиентам с отозванными сертификатами, то строку не комментируем а переходим к решению номер 2.
Вариант решения 2.
в /etc/easy-rsa/vars вписываем параметр:
set_var EASYRSA_CRL_DAYS 36500
Так как генерировал сертификаты я с помощью easyrsa, то сделаем сначала резервную копию файла /etc/openvpn/server/crl.pem
sudo cp /etc/openvpn/server/crl.pem /etc/openvpn/server/crl.pem-bkp
и генерируем новый /etc/openvpn/server/crl.pem
cd /etc/easy-rsa/
sudo ./easyrsa gen-crl
После генерации не забудьте переложить его из /etc/easy-rsa/pki/ в место, которое указывали в конфиге openvpn сервера /etc/openvpn/server/server.conf в строке crl-verify /etc/openvpn/server/crl.pem
После генерации, проверяем:
cd /etc/openvpn/server
sudo openssl crl -inform PEM -in crl.pem -text -noout
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm:
Issuer: CN = имя
Last Update: Jul 7 05:50:04 2021 GMT
Next Update: Jun 13 05:50:04 2121 GMT
Видим, что сгенерировали на 100 лет вперёд, вы можете генерировать на нужный вам период. Здесь 100 лет (35500 дней) просто для примера.
Перезапускаем службу openvpn
sudo service openvpn restart
и проблемы такой больше быть не должно.
🔍 Простой поиск по базе знаний
Достаточно часто при использовании списка отозванных сертификатов через месяц становится невозможно установить связь с сервером OpenVPN. В логах OpenVPN появляется ошибка установления соединения с сервером:
TLS: Initial packet from [AF_INET]ХХ.ХХ.ХХ.ХХ:62889, sid=ba13f8a4 4c4aec28 VERIFY ERROR: depth=0, error=CRL has expired: CN=client1 OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned TLS_ERROR: BIO read tls_read_plaintext error TLS Error: TLS object -> incoming plaintext read error TLS Error: TLS handshake failed SIGUSR1[soft,tls-error] received, client-instance restarting
Причина — в превышении времени жизни списка отозванных сертификатов, который хранится в файле crl.pem (CRL — certificate revoke list). Проверить это можно выдав следующую команду:
$ sudo openssl crl -inform PEM -in /etc/openvpn/easy-rsa/keys/crl.pem -text -noout [sudo] пароль для user1: Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: sha256WithRSAEncryption Issuer: /C=RU/ST=RU/L=Moscow/O=ХХХХ/OU=ХХХХ/CN=ХХХХ/name=EasyRSA/emailAddress=хххх@yourmail.ru Last Update: Sep 10 09:26:36 2020 GMT Next Update: Sep 11 09:26:36 2021 GMT
Из вывода видно что не позднее 11 сентября необходимо перевыпустить список отозванных сертификатов. Иначе будет появляться эта ошибка.
Можно конечно перевыпустить список ещё на год, но лучше всё таки увеличить его срок жизни.
Время жизни списка отозванных сертификатов задается в файле /etc/openvpn/easy-rsa/openssl-1.0.0.cnf в следующей секции:
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crl_extensions = crl_ext default_days = 3650 # how long to certify for default_crl_days= 365 # how long before next CRL default_md = sha256 # use public key default MD preserve = no # keep passed DN ordering
default_crl_days= 365 это и есть количество дней до перевыпуска списка отозванных сертификатов или время жизни этого списка. Открываем файл конфигурации любимым редактором, например nano:
$ sudo nano /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
и изменяем default_crl_days= 365 на, например, default_crl_days= 3650. То-есть на 10 лет. Затем перевыпускаем сам список:
$ sudo su # cd /etc/openvpn/easy-rsa # openssl ca -gencrl -keyfile keys/ca.key -cert keys/ca.crt -out keys/crl.pem -config ./openssl-1.0.0.cnf # exit
Проверяем:
$ sudo openssl crl -inform PEM -in /etc/openvpn/easy-rsa/keys/crl.pem -text -noout [sudo] пароль для user1: Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: sha256WithRSAEncryption Issuer: /C=RU/ST=RU/L=Moscow/O=ХХХХ/OU=ХХХХ/CN=ХХХХ/name=EasyRSA/emailAddress=хххх@yourmail.ru Last Update: Sep 10 09:26:36 2020 GMT Next Update: Sep 11 09:26:36 2030 GMT
Все нормально и все должно работать.
После обновления OpenVPN либо после переноса на другую ОС можно получить ошибку «OpenVPN CRL has expired». Клиенты не смогут подключиться к серверу.
На сервере в логе будет что-то вроде:
TLS: Initial packet from [AF_INET]19.10.5.11:51849, sid=ba13f8a4 4c4aec28 VERIFY ERROR: depth=0, error=CRL has expired: CN=client1 OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned TLS_ERROR: BIO read tls_read_plaintext error TLS Error: TLS object —> incoming plaintext read error TLS Error: TLS handshake failed SIGUSR1[soft,tls-error] received, client-instance restarting |
Это ошибка проверки списка отзывов сертификатов (CRL — certificate revoke list).
В конфиге сервера список CRL указан директивой:
crl-verify crl.pem
Убедиться, что проблема в этом списке, можно закомментировав эту строку в конфиге сервера и перезапустив сервер. Если дело только в списке отозванных сертификатов, клиенты спокойно начнут подключаться.
Для решения проблемы со списком CRL надо этот список обновить. В зависимости от того, каким образом вы управляете ключами OpenVN, это может быть по-разному.
Перед любыми действиями с CA рекомендую сделать архив:
# tar -cvzf /backup/openvpn.tar.gz /etc/openvpn
1) OpenSSL (общий случай):
# openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem -config openssl.cnf
Далее файл crl.pem скопировать в рабочее расположение OpenVPN и рестарт OpenVPN-сервера.
2) EasyRSA (версия 3):
# cd /etc/openvpn/easy-rsa
# ./easyrsa gen-crl
Далее файл crl.pem скопировать в рабочее расположение OpenVPN:
# mv pki/crl.pem /etc/openvpn/
Рестарт сервера OpenVPN:
# systemctl restart openvpn@server
3) EasyRSA (версия 2) + OpenSSL
Не нашел специальной команды на обновление CRL с помощью EasyRSA 2, пришлось использовать openssl.
# cd /etc/openvpn/easy-rsa/2.0/
# . /etc/openvpn/easy-rsa/2.0/vars
# echo $KEY_CONFIG
/etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf
По-умолчанию, обновление списка отозванных сертификатов производится раз в 30 дней. Это указано в конфиге в секции [ CA_default ]:
default_crl_days= 30
Можно увеличить этот интервал, например:
default_crl_days= 365
После изменения выполняем команду:
# openssl ca -gencrl -keyfile keys/ca.key -cert keys/ca.crt -out keys/crl.pem -config openssl-1.0.0.cnf
На этом этапе может возникнуть ошибка вроде configuration file routines:STR_COPY:variable has no value:conf_def.c
Можно просмотреть выпущенный сертификат CRL:
# openssl crl -inform PEM -in keys/crl.pem -text -noout
В информации будет указан список отозванных ключей (серийные номера), дата обновления и ближайшая необходимая дата регенерации CRL.
Далее файл crl.pem скопируем в рабочее расположение OpenVPN и рестартуем OpenVPN-сервер:
# service openvpn restart