Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SSLError:客户端错误(EOF违反协议发生)、服务器端错误(SSL3\u GET\u记录:错误的版本号)_Python_Sockets_Ssl - Fatal编程技术网

Python SSLError:客户端错误(EOF违反协议发生)、服务器端错误(SSL3\u GET\u记录:错误的版本号)

Python SSLError:客户端错误(EOF违反协议发生)、服务器端错误(SSL3\u GET\u记录:错误的版本号),python,sockets,ssl,Python,Sockets,Ssl,我在尝试在Python中创建SSL套接字以使用需要身份验证的代理时遇到了一些困难。我很抱歉篇幅太长,但我觉得最好尽可能多地包含细节 首先,服务器代码如下所示: class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): def __init__(self, server_address, RequestHandlerClass, client_manager, recv_queue):

我在尝试在Python中创建SSL套接字以使用需要身份验证的代理时遇到了一些困难。我很抱歉篇幅太长,但我觉得最好尽可能多地包含细节

首先,服务器代码如下所示:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):

    def __init__(self, server_address, RequestHandlerClass, client_manager, recv_queue):
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)

         <snipped out extra code>

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def setup(self):

        while True:
            try:
                print 'trying to wrap in ssl'
                self.request = ssl.wrap_socket(self.request,
                                   certfile=(os.getcwd() + '/ssl_certs/newcert.pem'),
                                   keyfile=(os.getcwd() + '/ssl_certs/webserver.nopass.key'),
                                   server_side=True,
                                   cert_reqs=ssl.CERT_NONE,
                                   ssl_version=ssl.PROTOCOL_TLSv1,
                                   do_handshake_on_connect=False,
                                   suppress_ragged_eofs=True)
                break

            except Exception, ex:
                print 'error trying to wrap in ssl %s' % ex

    def handle(self):
        # Display message that client has connected
        print '\r[*] Received connection from %s:%s\r' % (self.client_address[0], self.client_address[1])

        while self.stopped() == False:
            recv_msg = self.request.read(1024)

            if recv_msg == '':
                self.stop.set()
                server.recv_queue.put(recv_msg)
                break
            else:
                server.recv_queue.put(recv_msg)

        if self.stopped():
            print '[!] Received STOP signal from %s:%s; Exiting!' % (self.client_address[0], self.client_address[1])
sslsock = ssl.wrap_socket(self.proxy, server_side=False, do_handshake_on_connect=True,
                                      ssl_version=ssl.PROTOCOL_TLSv1)
现在,这里是我最初连接到代理的地方,我没有收到任何错误(我得到一个“200”状态码):

这就是客户失败的地方(我想)。我尝试使用
self.proxy
并将其封装在SSL中,如下所示:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):

    def __init__(self, server_address, RequestHandlerClass, client_manager, recv_queue):
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)

         <snipped out extra code>

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def setup(self):

        while True:
            try:
                print 'trying to wrap in ssl'
                self.request = ssl.wrap_socket(self.request,
                                   certfile=(os.getcwd() + '/ssl_certs/newcert.pem'),
                                   keyfile=(os.getcwd() + '/ssl_certs/webserver.nopass.key'),
                                   server_side=True,
                                   cert_reqs=ssl.CERT_NONE,
                                   ssl_version=ssl.PROTOCOL_TLSv1,
                                   do_handshake_on_connect=False,
                                   suppress_ragged_eofs=True)
                break

            except Exception, ex:
                print 'error trying to wrap in ssl %s' % ex

    def handle(self):
        # Display message that client has connected
        print '\r[*] Received connection from %s:%s\r' % (self.client_address[0], self.client_address[1])

        while self.stopped() == False:
            recv_msg = self.request.read(1024)

            if recv_msg == '':
                self.stop.set()
                server.recv_queue.put(recv_msg)
                break
            else:
                server.recv_queue.put(recv_msg)

        if self.stopped():
            print '[!] Received STOP signal from %s:%s; Exiting!' % (self.client_address[0], self.client_address[1])
sslsock = ssl.wrap_socket(self.proxy, server_side=False, do_handshake_on_connect=True,
                                      ssl_version=ssl.PROTOCOL_TLSv1)
这是我在客户端上看到的错误:

Traceback (most recent call last):
    File "C:\Python27\pyrevshell.py", line 467, in <module>
        proxyCommsHandler(None, None, None, None, list_of_proxies).run()
    File "C:\Python27\pyrevshell.py", line 300, in run
        ssl_version=ssl.PROTOCOL_TLSv1)
    File "C:\Python27\lib\ssl.py", line 372, in wrap_socket
        ciphers=ciphers)
    File "C:\Python27\lib\ssl.py", line 134, in __init__
        self.do_handshake()
    File "C:\Python27\lib\ssl.py", line 296, in do_handshake
        self._sslobj.do_handshake()
    SSLError: [Errno 8] _ssl.c:503: EOF occurred in violation of protocol
但紧接着是一个例外:

----------------------------------------
Exception happened during processing of request from ('x.x.x.x', 47144)
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 582, in process_request_thread
    self.finish_request(request, client_address)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 639, in __init__
      self.handle()
   File "shell_server.py", line 324, in handle
      recv_msg = self.request.read(1024)
   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 138, in read
      return self._sslobj.read(len)
SSLError: [Errno 1] _ssl.c:1348: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
----------------------------------------
虽然我意识到基于抛出的异常,这听起来像是一个明显的问题,但有趣的是:

  • 我最初通过代理成功连接,如上所示
  • 我可以成功地连接到同一代理后面的web浏览器,并且不会引发异常;我可以将数据传递到浏览器
  • 我在服务器端和客户端都尝试了不同的SSL协议版本,如中的表所示;每次客户端都会出现错误
我在连接的两端都使用了Wireshark。在使用普通浏览器并连接到服务器时,我看到了整个SSL握手和协商过程,一切都运行顺利

但是,当我使用上面所示的客户端时,只要我与它连接,我就会看到客户端发送一条
client Hello
消息,但随后我的服务器发送一个
RST
数据包来终止连接(我还没有确定这是在引发异常之前还是之后)


再一次,我为这么长的时间道歉,但我急需专家的建议。

我已经解决了我的问题。当我第一次通过代理连接时,我正在向远程主机发送
self.user\u代理
,这会干扰SSL握手

为了解决这个问题,在调用套接字上的ssl.wrap_socket之前,我在
def setup(self)
函数中放置了一个初始的
self.request.recv()

----------------------------------------
Exception happened during processing of request from ('x.x.x.x', 47144)
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 582, in process_request_thread
    self.finish_request(request, client_address)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 639, in __init__
      self.handle()
   File "shell_server.py", line 324, in handle
      recv_msg = self.request.read(1024)
   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 138, in read
      return self._sslobj.read(len)
SSLError: [Errno 1] _ssl.c:1348: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
----------------------------------------