Разобрать "Server Hello" из перехвата, используя pyOpenSSL - PullRequest
0 голосов
/ 31 октября 2018

У меня есть несколько PCAP для обмена TLS для отладки. Я хотел бы извлечь вещи из сообщения «Server Hello» так, как это сделал бы OpenSSL.

У меня есть то, что отправил сервер, в виде объекта bytes. Начинается с b'\x16\x03\x03 для типа рукопожатия, версия 1.2 TLS. Здесь - пример того, что видит Wireshark.

Похоже, что pyOpenSSL должен быть в состоянии интерпретировать такой объект, как это то, что OpenSSL будет видеть из сети в реальной жизни. Читая модульные тесты pyOpenSSL, похоже, что можно имитировать данные, поступающие с провода.

Однако я не смог заставить это работать:

from OpenSSL.SSL import Connection, Context, TLSv1_2_METHOD

context = Context(TLSv1_2_METHOD)
conn = Connection(context, None)
conn.set_connect_state()
conn.bio_write(b'\x16\x03\x03...')  # this goes on for a while
conn.do_handshake()

Ошибка OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_hello', 'parse tlsext')], что многообещающе - она ​​делает что-то . Написание «Hello Client» вместо «Server Hello» правильно дает unexpected message, а написание «тарабарщины» дает ошибку wrong version number (что также имеет смысл).

Моя цель - сделать так, чтобы Connection.get_ методы возвращали данные из этих воспроизведенных данных. Возможно ли это сделать, или pyOpenSSL не предоставляет необходимые биты OpenSSL?

...