CherryPy 18.6开启SSL运行5分钟后报SSL协议错误,求修复或替代模块
CherryPy 18.6版本运行5分钟后出现SSL协议错误的修复方案
问题根源
CherryPy默认使用的builtin内置SSL模块,基于Python标准库ssl模块实现,存在已知的TLS会话上下文清理缺陷,在默认300秒(即5分钟)的空闲连接超时阈值到达后,无法正确重置会话状态,会直接导致后续请求触发SSL协议错误。这类问题从CherryPy 17.x版本开始就有长期的社区反馈,并非证书配置错误导致。
具体修复步骤
- 替换SSL实现模块:安装依赖包
pyopenssl,将原有配置中的server.ssl_module参数值从builtin修改为pyopenssl,该模块是CherryPy官方适配的OpenSSL绑定实现,对TLS会话生命周期、连接复用的处理逻辑远稳定于内置实现,可从根本上解决超时后SSL会话损坏的问题。 - 补充连接生命周期配置:在全局配置中增加合理的超时、线程与请求限制参数,避免残留的坏连接长期占用线程池资源,需要新增的配置项包括:
server.timeout: 60将socket层空闲超时从默认的300秒缩短到60秒,及时释放无效连接server.max_threads: 10限制最大工作线程数,避免无限制创建线程导致SSL上下文泄漏server.max_requests: 1000限制单个进程连接处理的最大请求数,定期重启工作线程清理残留的会话状态
- 补充证书热加载逻辑:如果本地使用certbot自动续期Let's Encrypt证书,需要额外增加证书文件变更的监听逻辑,不要一直使用启动时加载到内存中的旧证书内容,避免磁盘上的证书被自动替换后,服务端继续使用失效证书导致后续握手失败。
调整后可用的配置示例
cherrypy.config.update({ 'server.socket_port': 443, 'server.socket_host': '0.0.0.0', # 替换原builtin为pyopenssl 'server.ssl_module': 'pyopenssl', 'server.ssl_certificate': '/Users/etethanhanordaz/letsencrypt/config/live/website.com/cert.pem', 'server.ssl_certificate_chain': '/Users/etethanhanordaz/letsencrypt/config/live/website.com/chain.pem', 'server.ssl_private_key': '/Users/etethanhanordaz/letsencrypt/config/live/website.com/privkey.pem', # 新增连接控制配置 'server.timeout': 60, 'server.max_threads': 10, 'server.max_requests': 1000, })
可替代的Python轻量自托管模块
以下模块均支持静态目录托管、简单接口自定义,且SSL实现稳定性优于默认配置下的CherryPy:
- FastAPI + Uvicorn:通过内置的
StaticFiles组件即可完成静态目录挂载,Uvicorn原生支持TLS1.2/1.3标准,SSL栈无会话清理缺陷,可长期稳定运行,整体代码改造成本与现有CherryPy方案基本一致。 - Flask + Waitress:Waitress是纯Python实现的生产级WSGI服务器,原生支持静态目录托管与SSL配置,会话处理逻辑经过长期生产验证,无CherryPy内置模块的内存泄漏与SSL状态损坏问题。
- Bottle + Gunicorn:Bottle为单文件轻量Web框架,仅需数行代码即可实现静态目录挂载与简单接口开发,配合Gunicorn的SSL工作进程可实现长期稳定的自托管服务,资源占用远低于CherryPy的默认线程池开销。
注意:上述替代方案均不需要额外配置反向代理,可直接绑定443端口对外提供HTTPS服务。
内容的提问来源于stack exchange,提问作者VoidNull
相关产品推荐
相关产品推荐

