Как закрыть сокет Python TLS 1.3 чисто (Send Close_notify) без un unwrap ()?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как закрыть сокет Python TLS 1.3 чисто (Send Close_notify) без un unwrap ()?

Сообщение Anonymous »

Я начинаю с Python, и я пытаюсь сделать простой сокет TLS 1.3, но у меня проблема.

Код: Выделить всё

Alert (Level: Fatal, Description: Decode Error)
< /code>
, который вызывает TCP RST со стороны моей клиента: < /p>
CLient -> Server TCP: [FIN, ACK]
Server -> Client TCP: [ACK]
Server -> Client TLS1.3: Alert (Level: Fatal, Description: Decode Error)
Client -> Server TCP: [RST, ACK]
< /code>
rst-error < /p>
код моего сервера: < /p>
import socket, ssl

host, port = "127.0.0.1", 8086

# SSL context
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("./Certificates/cert-server.pem", "./Certificates/cert-key.pem")

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
with context.wrap_socket(sock, server_side=True) as ssock:
ssock.bind((host, port))
ssock.listen(5)

while True:
conn, ip = ssock.accept()
from_client = ''

while True:
data = str(conn.recv(4096), encoding='utf8')
if not data:
break
print(data)
conn.send(bytes("I'm Server", encoding='utf8'))

conn.close()
break
< /code>
Мой клиент -код: < /p>
import socket, ssl

host, port = "127.0.0.1", 8086

# SSL context
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_default_certs()

# For Wireshark TLS Decryption
context.keylog_filename = "./keys.txt"

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
with context.wrap_socket(sock, server_hostname=host) as ssock:
ssock.connect((host, port))
ssock.send(bytes("I'm Client", encoding='utf8'))
from_server = str(ssock.recv(4096), encoding='utf8')
print(from_server)
< /code>
После некоторых исследований в Интернете я обнаружил, что сеанс TLS требует предупреждения о закрытии_notify < /code>, чтобы быть закрытым правильно.
Поэтому я добавил < /p>
 ssock.unwrap()
< /code>
к моему клиентскому коду: < /p>
import socket, ssl

host, port = "127.0.0.1", 8086

# SSL context
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_default_certs()

# For Wireshark TLS Decryption
context.keylog_filename = "./keys.txt"

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
with context.wrap_socket(sock, server_hostname=host) as ssock:
ssock.connect((host, port))
ssock.send(bytes("I'm Client", encoding='utf8'))
from_server = str(ssock.recv(4096), encoding='utf8')
print(from_server)
# Need add this to send TLS close_notify
ssock.unwrap()
< /code>
Когда я добавляю это, проблема решается, и мой сеанс закрывается правильно: < /p>
Client -> Server TLS: Alert(Level: Warning, Description: Close Notify)
Server -> Client TCP: [ACK]
Server -> Client TCP: [FIN, ACK]
CLient -> Server TCP: [ACK]
Client -> Server TCP: [FIN, ACK]
Server -> Client TCP: [ACK]
< /code>
close_notify < /p>
Почему оператор с wation автоматически отправляет закрытие_notify, когда сокет TLS закрыт? ssock.shutdown () 
, но это не имело никакого эффекта.


Подробнее здесь: https://stackoverflow.com/questions/797 ... out-unwrap
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»