【问题标题】:Both builtin and pyopensssl doesn't work with cherrypy内置和 pyopensssl 都不适用于cherrypy
【发布时间】:2021-03-23 22:02:15
【问题描述】:

我几周前在我的旧电脑上保护了我的 Cherrypy 网络服务。然后我遇到了问题,所以我将我的代码导出到一个新的上。在此之前,一切都很好。现在,当我使用内置 ssl 时,我的网页停止响应,因为在某些请求之后,cherrypy 没有响应(即使在终端中,它也只有在我修改代码时才能再次工作)。如果我使用 pyopenssl,一切都在我的电脑上运行良好。如果我尝试从另一台电脑或智能手机/平板电脑连接,我会收到此错误:

    "/usr/local/lib/python3.8/dist-packages/OpenSSL/SSL.py", line 1540, in _raise_ssl_error
    raise WantWriteError() 
    OpenSSL.SSL.WantWriteError

它是在我尝试返回图像之后出现的,甚至像网站图标一样小。 这是我的代码,我遵循了cherrypy文档:

    # MAIN
if __name__ == "__main__":
    conf = {
            '/':{
                    'request.dispatch':cherrypy.dispatch.MethodDispatcher(),
                    'tools.staticdir.root': os.path.abspath(os.getcwd()),
                    'tools.sessions.on':True,
                    'tools.sessions.secure' : True,
                    'tools.sessions.httponly' : True,
                    'tools.secureheaders.on' : True
                    
                },
            '/favicon.ico':
            {
                'tools.staticfile.on': True,
                'tools.staticfile.filename': os.path.abspath(os.getcwd()) + '/favicon.ico'
            },

            '/js':{
                    'tools.staticdir.on': True,
                    'tools.staticdir.dir':'./js'
                },
            '/css':{
                    'tools.staticdir.on': True,
                    'tools.staticdir.dir':'./css'
                },
            '/css/Resources':{
                    'tools.staticdir.on': True,
                    'tools.staticdir.dir':'./css/Resources'
                }
    }
    porta = 443 #porta usata
    ip = get_ip() #funzione che prende l'ip del pc

    #inizializzo cherrypy
    cherrypy.tree.mount(SleepRepository(), '/', conf)

        # if hasattr(app, 'toolboxes'):
        # # CherryPy 3.1+
        #   app.toolboxes['secureheaders'] = secureheaders.newauthtools

    cherrypy.config.update({'server.socket_host': ip })      
    cherrypy.config.update({'server.socket_port': porta}) 
    cherrypy.config.update({'server.max_request_body_size' : 35971520000}) #aumento il massimo in MB che posso ricevere
    cherrypy.server.ssl_module = 'pyopenssl'
    cherrypy.server.ssl_certificate = "cert.pem"
    cherrypy.server.ssl_private_key = "privkey.pem"
    cherrypy.engine.start()
    cherrypy.engine.block()

关于错误,我发现一个线程建议修改库的一行,但它的工作方式不一样......有人有想法吗?

【问题讨论】:

    标签: python python-3.x ssl cherrypy pyopenssl


    【解决方案1】:

    是的!我在提供图片时遇到了同样的问题,在这里找到了答案:https://github.com/cherrypy/cheroot/issues/245

    它应该在较新版本的 cheroot 中得到修复,但提供了一个补丁。在 makefile.py 中,将方法 BufferedWriter._flush_unlocked() 替换为:

    import OpenSSL
    def _flush_unlocked(self):
    self._checkClosed('flush of closed file')
    while self._write_buf:
        try:
            # ssl sockets only except 'bytes', not bytearrays
            # so perhaps we should conditionally wrap this for perf?
            n = self.raw.write(self._write_buf)
        except io.BlockingIOError as e:
            n = e.characters_written
        except (OpenSSL.SSL.WantReadError,OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e:
            n = 0
        del self._write_buf[:n]
    
    BufferedWriter._flush_unlocked = _flush_unlocked
    

    同一个线程有另一个建议,修改一行,这对我不起作用。您可能已经找到了相同的建议,但这个建议确实对我有用。

    【讨论】:

    • 谢谢,但我搬到了烧瓶,因为我需要结束我的项目......但我认为这在任何情况下都可能有用:)
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2018-11-27
    • 2018-05-24
    相关资源
    最近更新 更多