没有从包装的SSLsocked、Python接收到任何数据

2024-04-25 22:13:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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()方法中,我可以看到它的类型是SSLSocket,fd被设置(设置为某个正值),本地和远程IP和端口都有预期的值,所以我假设客户机成功地连接到了我的服务器,并且连接已打开。但是当我试图读取数据时

^{pr2}$

应该会收到更多的字节,我尝试了1,10,1024,但这没有任何区别,read()方法总是不返回任何内容。我试着检查或打印它,但没有什么要打印的。在

我在用Wireshark监控包裹。我可以看到,我希望读取的数据会到达我的服务器(我检查了IP和端口对于自我连接在Wireshark中),它发送ACK,然后从客户端接收FIN+ACK。因此,看起来这些数据是在一个较低的级别上得到正确处理的,但是read()方法无法访问它。在

如果我删除wrap_socket()调用,那么我就可以读取数据,但这是一些客户端正在发送以进行身份验证的数据。在

我在Mac机上使用python3.4。在

我怎么可能在Wireshark中看到数据包来了,但是我不能读取代码中的数据?在


Tags: 数据方法self服务器ssl客户机cliserver