How to solve openvpn errors after upgrading openssl

Если клиент на Windows

Поставить OpenVPN GUI, скачав отсюда. Скопировать клиентские ключи в . Скопировать конфиг клиента и вставить в файл , положить туда же. Всего в этом каталоге должно получиться пять файлов — .Обязательно запустить OpenVPN GUI от имени администратора, иначе в сиситеме не поднимутся маршруты, и произвести подключение двойным кликом по иконке в трее (такая область около часов, обычно в правом нижнем углу).

Ссылки по теме:Описание параметров конфигурационных файлов.Как сделать центр сертификации по феншую.Отзыв сертификата Easy-RSA без .crt файлаКак прикрутить доменную авторизацию через AD к openvpn

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

Генерация файла отозванных ключей:

cd ~/easy-rsa-master/easyrsa3
./easyrsa gen-crl

Сделать символическую ссылку в каталог с ключами (конечно, файл можно и скопировать, но придется делать каждый раз при отзыве сертификата):

ln -s ~/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/keys

В добавить строку

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

Отзыв сертификата пользователя User:

./easyrsa revoke User

Каждый раз при отзыве сертификата необходимо обновлять , чтобы внести в него изменения:

./easyrsa gen-crl

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

failed to update database
Easy-RSA error:
signing failed (openssl output above may have more detail)

CRL signature failed

Due to the vulnerabilities found in MD5, this hashing routine has been disabled by default on modern SSL. Our certificates, though, were still using it, so the new error message (after fixing the CRL), became:

Mon Nov  6 10:14:40 2017 TCP connection established with 192.168.100.1:18463
Mon Nov  6 10:14:41 2017 192.168.100.1:18463 TLS: Initial packet from 192.168.100.1:18463, sid=13fdd1fe 5d82d4d6
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 VERIFY ERROR: depth=0, error=CRL signature failure: C=IT, ST=PR, L=Parma, O=domain, OU=domain.eu, CN=user, name=user, emailAddress=info@stardata.it
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 TLS_ERROR: BIO read tls_read_plaintext error
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 TLS Error: TLS object -> incoming plaintext read error
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 TLS Error: TLS handshake failed
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 Fatal TLS error (check_tls_errors_co), restarting
Mon Nov  6 10:14:42 2017 192.168.100.1:18463 SIGUSR1 received, client-instance restarting

This one was trickier to solve. It turns out that you can re-enable MD5 as a workaround using two environment variables: and . In my case, I just added them to openvpn init script because the system is going to be decommissioned soon.

CRL expired

The OpenVPN server logs were reporting:

Mon Nov  6 10:04:22 2017 TCP connection established with 192.168.100.1:19347
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 TLS: Initial packet from 192.168.100.1:19347, sid=150b3618 b004e9a4
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 VERIFY ERROR: depth=0, error=CRL has expired: C=IT, ST=PR, L=Parma, O=domain, OU=domain.eu, CN=user, name=user, emailAddress=info@stardata.it
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 TLS_ERROR: BIO read tls_read_plaintext error
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 TLS Error: TLS object -> incoming plaintext read error
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 TLS Error: TLS handshake failed
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 Fatal TLS error (check_tls_errors_co), restarting
Mon Nov  6 10:04:23 2017 192.168.100.1:19347 SIGUSR1 received, client-instance restarting

This is a common problem on older systems, the culprit is in the OpenSSL configuration used to generate the CRL, that is limited to just 30 days by default.

So, I had to regenerate my CRL after increasing the parameter in the ssl config to 180 (for our use case is more than enough), using:

$ openssl  ca  -gencrl  -keyfile keys/ca.key  \
               -cert keys/ca.crt  -out keys/crl.pem \
               -config easy-rsa/openssl-1.0.0.cnf

Сервер

Конфиг сервера

Поставить OpenVPN и создать одноименного пользователя, под которым будет работать демон:

apt install openvpn
adduser --system --no-create-home --disabled-login --group openvpn

Создать конфиг сервера openvpn со следующим содержимым:

mcedit /etc/openvpn/server.conf

port 1194
proto udp
dev tun
#user openvpn
#group openvpn
dh /etc/openvpn/keys/dh.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
tls-auth /etc/openvpn/keys/ta.key 0
#crl-verify  /etc/openvpn/keys/crl.pem
script-security 2
cipher AES-256-CBC
tls-server
comp-lzo
mute 10
persist-key
persist-tun
max-clients 50
keepalive 10 900
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
### Эти параметры требуют пояснений.
# Пушить (передавать клиенту) свой DNS север
push "dhcp-option DNS 192.168.0.1"
# Пушить название домена
push "dhcp-option DOMAIN mydomain.com"
# Пушить маршрут локальной подсети. Для того, чтобы у клиентов был доступ до нее
push "route 192.168.0.0 255.255.254.0"
###
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 5

Создать каталоги для логов и хранения IP адресов клиентов:

mkdir /var/log/openvpn/
mkdir /etc/openvpn/ccd

Центр авторизации и ключи

Перейти в домашний каталог, скачать и распаковать easyrsa 3 версии:

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

Перейти в каталог easyrsa3 и объявить для него переменные:

cd ~/easy-rsa-master/easyrsa3
cp ~/easy-rsa-master/easyrsa3/vars.example ~/easy-rsa-master/easyrsa3/vars

Инициализировать (Public Key Infrastructure — Инфраструктура открытых ключей):

./easyrsa init-pki

Создать корневой сертификат. Обязательно ввести сложный пароль и сервера, например :

./easyrsa build-ca

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

./easyrsa gen-dh

Создать запрос на сертификат для сервера OVPN

Обращаю внимание, что сертификат будет незапаролен (параметр ), иначе при каждом старте OpenVPN будет запрашивать этот пароль:

./easyrsa gen-req vpn-server nopass

Создать сам сертификат сервера OVPN:

./easyrsa sign-req server vpn-server

Скопировать полученные ключи в рабочий каталог openvpn:

mkdir -p /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/private/vpn-server.key /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn/keys

Создать «HMAC firewall» для защиты от DoS аттак и флуда UDP порта:

cd /etc/openvpn/keys/
openvpn --genkey --secret ta.key

Запустить :

/etc/init.d/openvpn start

Минимальная настройка Iptables для доступа OpenVPN клиентов к локальной сети

# Включить форвард в ядре
echo "1" > /proc/sys/net/ipv4/ip_forward
# Разрешить входящие соединения на порт OVPN
iptables -A INPUT -p UDP --dport 1194 -j ACCEPT
# Разрешить форвард между подсетью OVPN и локальной
# При чем, ставить их в начале цепочки, если правил много
iptables -A FORWARD -s 10.15.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.15.0.0/24 -s 192.168.0.0/24 -j ACCEPT

Настройка OpenVPN для выхода в интернет

Наткнулся на тред, поржал и решил дополнить заметку. Если OpenVPN нужен для выхода в интернет — надо сделать, чтобы OpenVPN был шлюзом по умолчанию (default gateway) и подправить правила iptables. Собственно, конфиг для сервера:

port 1194
proto udp
dev tun
dh /etc/openvpn/keys/dh.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
tls-auth /etc/openvpn/keys/ta.key 0
crl-verify  /etc/openvpn/keys/crl.pem
script-security 2
cipher AES-256-CBC
tls-server
comp-lzo
mute 10
persist-key
persist-tun
max-clients 50
keepalive 10 900
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
push "redirect-gateway def1"
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 5

Конфиг для клиента не будет отличаться от приведенного выше.

Отзыв клиентских сертификатов

Иногда может понадобиться отозвать клиентский сертификат для предотвращения доступа к серверу VPN: сотрудник уволился, потерял ноутбук или просто нужно определенному сотруднику нужно закрыть доступ к внутренней корпоративной сети.

Причины могут быть разные. Как отозвать выданный ему клиентский сертификат Open VPN?

Для того чтобы отозвать сертификат/сертификаты нужно сформировать список отозванных сертификатов и сказать серверу OpenVPN чтобы тот при коннекте клиента сверялся с этим списком.

Для начала нужно зайти в директорию центра сертификации, который обычно находится в  /etc/openvpn/easy-rsa/ и ввести команды:

cd /etc/openvpn/easy-rsa/
sudo su
source /etc/openvpn/easy-rsa/vars

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

./revoke-full client

где client — это имя сертификата. С этим именем в папке /etc/openvpn/easy-rsa/keys хранятся три файла:

client.key
client.csr
client.crt

Иногда, в старых версиях OpenVPN, может появляться ошибка  23. Это нормально, но в последней версии она не появляется. В результате работы будет создан файл crl.pem в директории keys с необходимой для отзыва сертификата информацией.

Для простоты можно переместить этот файл в директорию /etc/openvpn:

sudo cp keys/crl.pem /etc/openvpn

Затем открываем файл конфигурации сервера OpenVPN вашим любимым редактором текста, например nano:

sudo nano /etc/openvpn/server.conf

и в конец файла добавляем строку crl-verify. Теперь сервер OpenVPN будет проверять список отозванных сертификатов каждый раз, когда кто-то устанавливает соединение с сервером.

crl-verify /etc/openvpn/crl.pem

Сохраните и закройте файл.

Перезапустите OpenVPN для завершения процесса отзыва сертификата:

sudo service openvpn restart

Теперь клиент не сможет устанавливать соединение с сервером OpenVPN используя сертификат client.

Обобщая всё вышесказанное для отзыва дополнительных сертификатов нужно выполнить следующие шаги:

  • Сгенерировать новый список отозванных сертификатов используя команду source vars в директории /etc/openvpn/easy-rsa и выполняя команду revoke-full с именем клиента.
  • Скопироватье новый список отозванных сертификатов в директорию /etc/openvpn перезаписав тем самым старый список.
  • Перезапустите сервис OpenVPN.

Эта процедура может быть использована для отзыва любых созданных вами ранее сертификатов. Каждый раз при отзыве клиентского сертификата, формируется новый crl.pem. Это и есть список всех отозванных сертификатов.

Клиент

Ключи

Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User:

cd ~/easy-rsa-master/easyrsa3
./easyrsa gen-req User

Если авторизация будет внешней (например ADшная), то пароль не потребуется. Создание запроса без парольного ключа для клиента:

./easyrsa gen-req User nopass

Создание ключа пользователя (по дефолту из vars сроком на 10 лет):

./easyrsa sign-req client User

Или с ограничением действия сертификата в 90 дней (после истечения срока можно только перевыпустить):

./easyrsa sign-req client User -days 90

Клиенту передать эти файлы:

~/easy-rsa-master/easyrsa3/pki/issued/User.crt
~/easy-rsa-master/easyrsa3/pki/private/User.key
~/easy-rsa-master/easyrsa3/pki/ca.crt
/etc/openvpn/keys/ta.key

Конфиг

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
cipher AES-256-CBC
tls-client
ca "ca.crt"
tls-auth "ta.key" 1
cert "User.crt"
key "User.key"
remote-cert-tls server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
nobind
resolv-retry infinite

Для удобства все пять клиентских файлов можно объединить в один

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: