没有从包装的SSLsocked,Python收到数据

时间:2015-05-19 21:51:24

标签: python sockets ssl python-3.4

我正在用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中发送数据包,但我无法读取代码中的数据?

0 个答案:

没有答案