Пользовательский клиент OpenVPN не получает сервер TLS Привет

Я пишу простой клиент OpenVPN (с Python & Scapy & [scapy-ssl_tls]), который должен подключаться к серверу OpenVPN.

Я открываю сокет UDP в Python, и с помощью Scapy я определяю свой собственный уровень OpenVPN поверх UDP (согласно спецификациям OpenVPN) и отправляю на него пакеты (как и исходный клиент).

Я могу успешно отправить начальное P_CONTROL_HARD_RESET_CLIENT_V2 сообщение и получить ответ от сервера, который равен P_CONTROL_HARD_RESET_SERVER_V2, затем я отправляю P_ACK_V1 сообщение.

Имейте в виду, что я правильно генерирую идентификаторы всех сеансов.

Теперь, когда я отправляю первое P_CONTROL_V1 сообщение, которое по сути является TLS ClientHello поверх уровня OpenVPN, я получаю P_ACK_V1 подтверждение от сервера, но это все. Обратите внимание, что этот ACK означает только то, что сервер получил сообщение OpenVPN, не обязательно данные TLS. Я должен получить ServerHello и все остальное, но сервер ничего не отправляет после ACK.

http://i.stack.imgur.com/4RBSV.png

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

http://i.stack.imgur.com/OYTLU.png

Wireshark объединяет и собирает пакеты автоматически, когда у него есть полное рукопожатие, так что сравнивать его немного сложно.

Я также попытался воспроизвести полное сообщение ClientHello из предыдущего реального общения с клиентом (хотя я сгенерировал свое собственное местное время), но результаты были такими же - ACK, а затем ничего.

Я также проверил журналы сервера и не нашел никаких ошибок или чего-либо, что могло бы мне помочь.

Я создаю свой пакет TLS следующим образом (с дополнительными опциями):

pack = openvpn(opcode=0x20, session_id=ses, message_packet_id_array_length=0, message_packet_id=0000)/TLSRecord()/TLSHandshake()/TLSClientHello()

openvpn - это слой, который я определил в Scapy.

Есть идеи, почему я не получаю ServerHello?

РЕДАКТИРОВАТЬ: учитывая, что я не получаю никаких предупреждений с сервера, я почти уверен, что сервер по какой-то причине даже не видит мой ClientHello.


person Tomas    schedule 23.11.2015    source источник
comment
может случиться так, что ваша реализация отправляет только ClientHello (первый снимок экрана), а «реальная вещь» состоит из нескольких фрагментов, включая ClientHello + Certificate + ClientKeyExchange + CertificateVerify ... (см. столбец с информацией о снимке экрана и информацию о «фрагментах сообщения»)   -  person tintin    schedule 24.11.2015
comment
В «реальном» клиент отправляет только ClientHello (которое Wireshark разбивает на два P_CONTROL_V1 сообщения), а затем сервер отправляет собственное ServerHello и так далее. Да, мне нужно отправлять сертификаты и все такое, но только после ответа сервера. Я могу четко наблюдать это с помощью Wireshark, когда смотрю на реальную связь клиент-сервер - после ClientHello приходит ServerHello. Просто Wireshark объединяет все сообщения клиентов, даже если они были отправлены в разном порядке.   -  person Tomas    schedule 24.11.2015


Ответы (1)


Очевидно Message Packet-ID должно быть 1 (или больше). Теперь я получаю ответ от сервера.

введите здесь описание изображения

Официальная спецификация только упоминает, что идентификатор пакета предназначен для защита от воспроизведения хотя ..

person Tomas    schedule 24.11.2015