我正在尝试修改我用python套接字库编写的套接字服务器,以便使用python的SSL库进行加密。
我无法成功打开与服务器的连接,用SSL上下文包装并将数据发送到服务器,但发送回客户端的数据不是应该的。
我怀疑服务器响应没有在客户端解密,但我不知道为什么。我对SSL / TLS和网络都很陌生,所以...我错过了什么?
客户端也是用python编写的(目前为便于测试)
代码:
相关服务器的东西:
def sslServerLoop():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(5)
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain('cert.pem')
while True:
conn, addr = s.accept()
sslConn = context.wrap_socket(conn, server_side=True)
data = sslConn.recv(1024)
sslConn.sendall(response)
sslConn.close()
相关客户资料:
context = ssl.create_default_context(cafile='cert.pem')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = context.wrap_socket(s, server_hostname=server_addr)
s.connect((address, port))
s.sendall(msg)
s.shutdown(socket.SHUT_WR)
response = s.recv(1024)
从客户端发送到服务器工作正常,但发送回客户端的数据是错误的。例如,如果我在服务器端设置response = bytes([1])
,我会在客户端收到b'\x17\x03\x03\x00\x19\xac\xb6\x7f@\xc0\xd3\xce%\x13G\x01\xbd\x88y\xf0\xda..\x02\xf9\xe4o\xdd\x1a\xdb'
。每次我尝试运行它时大多数都会改变,但前5个字节总是相同的(这也是我怀疑它不被解密的部分原因。)
cert.pem是使用openssl生成的自签名证书,如python 3 SSL模块文档中所述
答案 0 :(得分:0)
关闭用于SSL的套接字是不合法的。这是违反协议的行为。您必须通过正在使用的SSL / TLS API关闭。