Когда сеанс закрывается, я получаю ошибку TLS:
Код: Выделить всё
Alert (Level: Fatal, Description: Decode Error)
Код: Выделить всё
CLient -> Server TCP: [FIN, ACK]
Server -> Client TCP: [ACK]
Server -> Client TLS1.3: Alert (Level: Fatal, Description: Decode Error)
Client -> Server TCP: [RST, ACK]

Код моего сервера:
Код: Выделить всё
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
Код: Выделить всё
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)
Поэтому я добавил
Код: Выделить всё
ssock.unwrap()
Код: Выделить всё
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()
Код: Выделить всё
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]

Почему оператор with не отправляет автоматически close_notify при закрытии сокета TLS?
Есть ли способ правильно закрыть сеанс TLS в Python без явного вызова unwrap()?
Я пробовал ssock.shutdown(), но это не дало никакого эффекта.