我正在用Python编写TLS服务器。我接受来自客户端的连接,包装套接字然后尝试读取数据 - 没有成功。
我的服务器继承自socketserver.TCPServer。我的套接字是非阻塞的 - 我覆盖了server_bind()方法。套接字被包装,但握手必须单独完成,因为异常会引发:
def get_request(self):
cli_sock, cli_addr = self.socket.accept()
ssl_sock = ssl.wrap_socket(cli_sock,
server_side=True,
certfile='/path/to/server.crt',
keyfile='/path/to/server.key',
ssl_version=ssl.PROTOCOL_TLSv1,
do_handshake_on_connect=False)
try:
ssl_sock.do_handshake()
except ssl.SSLError as e:
if e.args[1].find("SSLV3_ALERT_CERTIFICATE_UNKNOWN") == -1:
raise
return ssl_sock, cli_addr
为了处理收到的数据,我创建了一个继承自socketserver.StreamRequestHandler的类(我也尝试使用BaseRequestHandler,但没有运气,结束时遇到同样的问题 - 没有收到数据)。 当我在handle()方法中打印self.connection时,我可以看到它是SSLSocket类型,fd被设置(到某个正值),本地和远程IP和端口都有预期的值,所以我假设一个客户端已成功连接到我的服务器并且连接已打开。但是当我尝试读取数据时
self.connection.read(1)
应该收到更多的字节,我尝试使用1,10,1024,但它没有任何区别,read()方法总是不返回任何内容。我试图检查len或打印它,但没有什么可以打印。
我正在使用Wireshark监控软件包。我可以看到我期望读取的数据来到我的服务器(我检查了自身连接和Wireshark中的IP和端口是相同的),它发送ACK然后从客户端接收FIN + ACK。因此看起来数据来自并在低级别上正确处理,但不知何故read()方法无法访问它。
如果我删除了wrap_socket()调用,那么我就能读取数据,但这是客户端发送的用于身份验证的一些数据。
我在Mac机器上使用Python 3.4。
我怎么可能在Wireshark中发送数据包,但我无法读取代码中的数据?