Назад | Перейти на главную страницу

Как подключиться к серверу OpenVPN и сбросить цепочку сертификатов, представленную при подключении?

Моей первой мыслью было использовать что-то вроде openssl s_client но это поддерживает только TCP, а не UDP, и, похоже, требуется особая магия, чтобы заставить TLS поверх UDP работать, как мне взаимодействовать с этим и получить дамп представленной цепочки сертификатов? (Мне нужны именно сертификаты, а не информация о них)

Я использую сервер OpenVPN в режиме TCP, и я могу подтвердить, что вы не может использовать openssl s_client чтобы получить сертификат:

[me@risby 17]$ openssl s_client -connect openvpn.example.com:1194
CONNECTED(00000003)
140413456672632:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 205 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

Я могу только предположить, что, хотя OpenVPN использует SSL, он делает это иначе, чем стандартное соединение SSL / TLS. Так что я не думаю, что это правильный путь.

Я надеялся найти openvpn вызов клиента, который сбросил бы сертификаты, но пока этого не сделал. Мне жаль, что у меня нет для вас большего, но я подумал, что стоит написать ответ, который поможет вам не тратить время зря.

Опираясь на в основном полное решение в этой ветке Питера Шурды (см. там некоторые объяснения относительно используемых openvpn options), это должно сделать работу по получению сертификатов сервера.

Я предполагаю, что у вас есть рабочий файл конфигурации OVPN в config.ovpn и что вы аутентифицируете клиента с помощью имени пользователя и пароля (это может быть опущено, в зависимости от ваших настроек).

Подготовить рабочий каталог:

WD=/tmp/openvpn-cert
mkdir $WD

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

echo -e '#!'"/bin/sh\ncp \$peer_cert $WD/server-cert-\$1.pem" >$WD/extract-cert.sh
chmod +x $WD/extract-cert.sh

echo -e "fakeusername\nfakepassword" >$WD/creds.dat

Попробуйте связаться с openvpn:

openvpn --config config.ovpn --auth-user-pass $WD/creds.dat --tls-export-cert $WD \
    --script-security 2 --tls-verify $WD/extract-cert.sh --log /dev/null

Теперь у вас должен быть сертификат сервера, доступный в $WD/server-cert-0.pem и может работать с ним, например получить не раньше, чем и notAfter даты:

openssl x509 -in $WD/server-cert-0.pem -noout -dates

Остальные сертификаты в цепочке будут доступны в $WD/server-cert-1.pem и т.д. Число берется из первого аргумента, переданного в extract-cert.sh- глубина сертификата. Увидеть --tls-verify документация в Перехватчики скриптов раздел страницы руководства.

Я столкнулся с той же проблемой, и ее можно решить, используя openvpn с определенными аргументами. Важные из них --tls-verify и --tls-export-cert. --tls-verify должно сопровождаться именем файла сценария, который вы хотите выполнить. Переменная окружения peer_cert будет содержать расположение сброшенной цепочки сертификатов. В --tls-export-cert должно сопровождаться именем каталога, в который будет дамп сертификата. Сертификат автоматически удаляется после завершения сценария tls-verify.

Единственная проблема, которую я обнаружил, заключалась в том, что для этого требуется, чтобы у вас уже был сертификат CA. Если у вас его нет, сценарий не будет выполняться, и я не нашел способа обойти это.

Пример использования:

openvpn --remote remote.host.to.check 1194 --dev tun --proto udp --ca tmp/openvpnca.cert --client --auth-user-pass tmp/noauth.txt --remote-cert-tls server --tls-verify tmp/tls-verify.sh --script-security 2 --tls-export-cert tmp/tlsverifies

tmp/noauth.txt - фиктивный файл с двумя строками, содержащими поддельное имя пользователя / пароль. tmp/tlsverifies - это каталог, в который будет выгружен файл цепочки. tmp/tls-verify.sh это сценарий оболочки, который обрабатывает peer_cert переменная окружения