You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:15:06