CherryPy出现DECRYPTION_FAILED_OR_BAD_RECORD_MAC错误如何处理或优化日志
问题解决方案
错误根因
DECRYPTION_FAILED_OR_BAD_RECORD_MAC属于SSL握手阶段的非致命异常,绝大多数场景是客户端侧问题导致:比如客户端网络波动中途断连、客户端主动中断握手请求、中间人尝试篡改SSL报文、老旧客户端不兼容服务端配置的加密套件,本身不会影响服务端正常运行,测试环境很难复现是因为很难模拟这类不稳定的客户端请求场景。
直接修复错误的方案
- 升级依赖
优先将cheroot、Python小版本升级到最新稳定版,旧版本cheroot对异常中断的SSL连接捕获逻辑不完善,新版本已经做了默认兼容,大部分场景升级后就不会再抛出该堆栈。 - 调整SSL加密套件兼容配置
如果服务端配置的加密套件过于严格,部分老旧客户端无法适配就会触发该错误,可以适当放宽加密套件范围,示例配置:import cherrypy from cheroot.ssl.builtin import BuiltinSSLAdapter # 主流兼容加密套件列表 cipher_list = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384" if __name__ == '__main__': cherrypy.server.ssl_module = 'builtin' cherrypy.server.ssl_certificate = "你的证书路径.pem" cherrypy.server.ssl_private_key = "你的私钥路径.pem" # 注入自定义加密套件 def adjust_ssl_context(adapter): adapter.context.set_ciphers(cipher_list) BuiltinSSLAdapter.adjust_context = adjust_ssl_context cherrypy.quickstart(你的应用实例()) - 主动捕获特定异常
确认该错误不影响业务的前提下,可以自定义SSL适配器直接捕获该类错误,不抛出堆栈:from cheroot.ssl.builtin import BuiltinSSLAdapter import ssl class CustomSSLAdapter(BuiltinSSLAdapter): def wrap(self, sock): try: return super().wrap(sock) except ssl.SSLError as e: if "DECRYPTION_FAILED_OR_BAD_RECORD_MAC" in str(e): # 忽略该类错误,不抛出堆栈 return None, None raise # 替换默认SSL适配器 cherrypy.server.ssl_adapter_class = CustomSSLAdapter
日志改为单行输出的方案
如果不需要修复错误,仅需要简化日志,可以自定义CherryPy的错误日志格式化器,过滤该类错误的堆栈仅输出单行信息:
import logging import ssl from cherrypy import _cplogging class CustomSSLLogFormatter(_cplogging.DefaultFormatter): def formatException(self, exc_info): exc_type, exc_value, _ = exc_info if isinstance(exc_value, ssl.SSLError) and "DECRYPTION_FAILED_OR_BAD_RECORD_MAC" in str(exc_value): return "ssl.SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption failed or bad record mac" return super().formatException(exc_info) # 替换CherryPy错误日志的格式化器 for handler in cherrypy.log.error_log.handlers: handler.setFormatter(CustomSSLLogFormatter())
内容的提问来源于stack exchange,提问作者uak
相关产品推荐
相关产品推荐

