Моей первой мыслью было использовать что-то вроде 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
переменная окружения