У меня есть несколько 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?