Три разных факта в большинстве обсуждений OpenVPN и TLS сводятся в одну строку: что умеет ваша сборка клиента, что разрешает профиль и о чём фактически договорилась сессия. Короткий список наборов TLS 1.3 отвечает лишь наполовину на средний вопрос и ничего не говорит о нижней границе версии протокола. Пройдите проверки ниже по порядку и остановитесь на первой, которая не выполняется, потому что каждая следующая предполагает, что предыдущие уже решены.

Проверьте сборку, прежде чем читать любой список

Директива конфигурации не может добавить поддержку протокола в бинарный файл, у которого её нет. Начните с баннера версии, который называет скомпилированную криптографическую библиотеку:

openvpn --version

Сборка 2.6, слинкованная с OpenSSL, принимает и tls-cipher, и tls-ciphersuites. Сборка с mbed TLS вообще не имеет выбора наборов TLS 1.3, а руководство 2.6 помечает tls-ciphersuites как опцию OpenSSL. Если сервер пересобран с другим backend, тот же профиль может изменить поведение, не изменив ни одной строки конфигурации.

Пока вы здесь, запустите openvpn --show-tls и сохраните вывод. Это инвентарь, с которым вы будете сравнивать позже, и дёшево зафиксировать его до того, как кто-то начнёт редактировать профили.

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

Держите границы версии отдельно от списков шифров

В руководстве 2.6 это три элемента управления, а не один:

  • tls-cipher задаёт политику шифров для TLS 1.2 и более старых версий и передаётся в список шифров OpenSSL;
  • tls-ciphersuites выбирает наборы TLS 1.3;
  • tls-version-min и tls-version-max ограничивают версии протокола, которые соединение может использовать.

Поэтому аккуратно подрезанный список наборов TLS 1.3 ничего не доказывает о том, что старая версия всё ещё разрешена. Если требование — «только TLS 1.3», его несёт нижняя граница версии, а список наборов лишь сужает выбор внутри этой границы:

tls-version-min 1.3
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

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

Канал данных — четвёртый элемент управления. data-ciphers согласует симметричный шифр внутри туннеля, и его результат ничего не говорит о версии TLS канала управления. Видеть AES-256-GCM в сводке сессии не является доказательством TLS 1.3 ни в одну сторону.

Читайте show-tls как локальный инвентарь

--show-tls перечисляет наборы, поддерживаемые криптографической библиотекой, с которой слинкован этот бинарный файл, в порядке предпочтения. Это не отчёт от шлюза. Руководство прямо говорит, что список берётся из локальной библиотеки, а значит, ноутбук с OpenSSL 3.x и маршрутизатор со старой сборкой напечатают разные списки, разговаривая с одним и тем же сервером.

EvidenceWhat it actually describes
--show-tls outputCapabilities of this client build and its library
Profile directivesWhat this attempt is allowed to offer
Session log lineWhat this one negotiation selected

Предположим, клиент поддерживает наборы A, B и C, и одна сессия выбирает B. Это ничего не устанавливает о том, разрешает ли сервер A или C, и ничего о том, является ли B единственным разрешённым выбором. Держите три строки раздельно, и большинство запутанных обсуждений TLS разрешатся сами.

Инвентарь всё же стоит сохранять. Когда сессия не удаётся, сравнение списка библиотеки со списком профиля показывает, была ли у клиента вообще возможность предложить то, что хотел сервер. Оно также показывает, не убрала ли смена backend молча TLS_CHACHA20_POLY1305_SHA256 из пула, на который полагаются старые клиенты, — тот вид регрессии, который проявляется как горстка пользователей, не могущих подключиться, тогда как все остальные ничего не замечают.

Спросите у шлюза то, на что он может ответить

Если вы администрируете сервис, проверяйте эффективную конфигурацию работающего экземпляра, а не файл на диске. OpenVPN мог быть запущен с другим путём --config, может подтягивать включаемые файлы и мог не перезапускаться после правки. Клиенты сталкиваются с политикой работающего демона.

Если вы им не администрируете, попросите оператора о поддерживаемых требованиях к клиентам или ограниченном приёмочном тесте. Отклонённая попытка — не обязательно отклонённый набор: нижняя граница версии, проверки идентичности сертификата вроде remote-cert-tls или несоответствие tls-auth и tls-crypt могут завершить обмен ещё до того, как выбор набора станет важен. Прочитайте ошибку сервера, прежде чем менять список клиента, потому что «handshake failed» охватывает четыре разные причины, и только одна из них — несовпадение шифра.

Направление openssl s_client на порт VPN тоже не воспроизводит вопрос. Канал управления работает внутри собственной рамки OpenVPN, поэтому сырой TLS-зонд проверяет другой протокол на порту, который ждёт чего-то иного. Любой вывод из него относится к зонду, а не к туннелю.

Запишите два результата и держите их раздельно

Свежая разрешённая сессия создаёт строку канала управления с указанием версии протокола и выбранного шифра, а также отдельную строку канала данных с указанием шифра туннеля. Зафиксируйте обе вместе с версией клиента и именем профиля и отметьте, какой экземпляр сервера ответил:

openvpn --config office.ovpn --verb 4 2>&1 | tee session.txt

Затем читайте эти две строки из того файла, а не из памяти. Пара — это доказательство; одно имя набора — предпочтение, а граница версии — отдельное утверждение о том, от чего сервер отказывается.

Выполняйте проверки в таком порядке. Подтвердите сборку и backend с помощью --version. Зафиксируйте --show-tls до любых изменений. Назовите требуемую нижнюю границу версии отдельно от списка наборов. Подтвердите эффективную политику работающего экземпляра у его владельца. Пронаблюдайте одну разрешённую сессию и, если план позволяет, одну отклонённую попытку со старой версией. Запишите результаты канала управления и канала данных как отдельные находки.

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

Похожие статьи