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

Python3.8 Modbus TLS客户端EE certificate key too weak错误如何解决?

错误根因

你遇到的报错是SSL证书校验失败,触发原因是服务端使用的示例证书采用512位RSA密钥,Python 3.8内置的OpenSSL库默认安全等级要求RSA密钥长度至少为2048位,强度不足的证书会被直接拦截。你使用的GitHub示例密钥为了演示生成的是弱密钥,不符合生产环境安全规范。

合规解决方案

分两种场景处理:

场景1:生产环境使用(推荐)

直接重新生成符合安全强度要求的证书和密钥,操作步骤如下:

  1. 生成2048位RSA私钥:
openssl genrsa -out server.key 2048
  1. 生成自签名证书(有效期可自行调整,这里设为10年):
openssl req -new -x509 -key server.key -out cert.pem -days 3650
  1. 替换服务端的旧私钥和证书,同时客户端继续使用原有校验逻辑即可,不需要修改代码。

场景2:测试环境必须使用现有弱密钥

仅调整SSL上下文的安全等级,不关闭证书校验,在你的代码中context.load_verify_locations('cert.pem')之后添加一行配置即可:

context.set_ciphers('DEFAULT@SECLEVEL=1')

安全等级1允许RSA密钥长度不低于1024位,刚好兼容你现有的512位测试密钥,同时保留证书合法性校验的能力,比直接关闭校验更安全。

修改后的完整连接代码片段如下:

def _do_open(self):
    """Connect to the Modbus slave"""
    if self._sock:
        self._sock.close()
    self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.set_timeout(self.get_timeout())
    self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    call_hooks("modbus_tcp.TcpMaster.before_connect", (self, ))
    context = SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    context.options |= ssl.OP_NO_TLSv1

    context.load_verify_locations('cert.pem')
    # 仅添加这一行调整安全等级,不关闭校验
    context.set_ciphers('DEFAULT@SECLEVEL=1')
    context.check_hostname = False
    self._sock.connect((self._host, self._port))
    self._sock = context.wrap_socket(self._sock, server_hostname=self._host)

如果要进一步合规,可以把check_hostname改为True,同时保证你访问的服务端host和证书中配置的SAN/CN字段一致。

内容的提问来源于stack exchange,提问作者gogogo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:45:01