Определение типа обмена пакетами для сервера сокетов Python ssl / tls - PullRequest
0 голосов
/ 26 мая 2018

В настоящее время я пытаюсь реконструировать, как обмен ключами и шифрование работают для программы.В основном я использовал wire shark, чтобы выяснить, как шифруются пакеты.Из того, что я обнаружил, они используют ECDHE-RSA-AES128-GCM-SHA256 с TLS1.2

Это то, что у меня сейчас есть.

import socket, ssl

tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSocket.bind(('', 443))
tcpSocket.listen(1)

while True:
    newsocket, fromaddr = tcpSocket.accept()
    newsocket = ssl.wrap_socket(newsocket,
                            server_side=True,
                            do_handshake_on_connect=True,
                            certfile="cert.pem",
                            ssl_version=ssl.PROTOCOL_TLSv1_2,
                            ciphers="ECDHE-RSA-AES128-GCM-SHA256")
    try:
        #Later add stuff
        pass
    finally:
        newsocket.shutdown(socket.SHUT_RDWR)
        newsocket.close()

Я пытался представить, как этоработает, используя простую картинку здесь .Я сделал это, используя пакеты wireshark, которые я видел здесь

В настоящее время с этим кодом сервер никогда не отвечает с помощью обмена ключами клиента, а вместо этого просто падает, что приводит к https://hastebin.com/wiqojapule.sql

Таким образом, основной вопрос, который я пытаюсь задать, заключается в том, почему программа python никогда не распознает клиента и затем передает привет серверу.В настоящее время он просто отправляет клиенту Hello обратно.

Кроме того, здесь есть акула для моего python-сокета и программы: здесь

1 Ответ

0 голосов
/ 27 мая 2018

Сравнение двух файлов pcap (с реальным сервером и с тестовым сервером) выделяют две вещи:

  • В рабочем случае (реальный сервер) клиент отправляет расширение server_name (SNI).) с целевым именем хоста и сервером отправляет обратно сертификат, подписанный общедоступным центром сертификации.
  • В случае сбоя (тестовый сервер) клиент не отправляет расширение server_name, а сервер отправляет толькосамоподписанный сертификат обратно.Затем клиент закрывает соединение, т. Е. Квитирование не завершено.

Отсутствующее расширение SNI для тестового сервера, вероятно, связано с тем, что в качестве IP-адреса указан адрес назначения, а не имя хоста.И это, вероятно, также не проблема.

Скорее всего, вместо этого клиенту просто не нравится самоподписанный сертификат, отправленный сервером, и, следовательно, он закрывает соединение.Более привлекательный клиент, вероятно, отправит сначала предупреждение TLS unknown CA перед закрытием, но весьма часто стеки TLS не отправляют эти предупреждения и вместо этого просто закрывают соединение.

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

Здесь нет ничего особенного для обратного инжиниринга.Кажется, что клиент использует TLS, как указано в стандарте, вероятно, используя некоторые из множества доступных стеков TLS, а не реализуя свой собственный.И вопреки предположению OP, что используется только определенный шифр, клиент фактически предлагает несколько шифров (19 шифров, предлагаемых в ClientHello), и сервер может выбрать любой из них.

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

...