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

如何解决Python Requests中的DH_KEY_TOO_SMALL错误?

解决Python Requests访问路由器时的DH_KEY_TOO_SMALL错误

错误原因

这个错误是因为你的路由器使用的Diffie-Hellman(DH)密钥长度过短,不符合现代SSL/TLS的安全规范。即使你设置了verify=False关闭证书验证,也无法绕过这个检查——因为这是密钥交换环节的安全限制,和证书有效性无关。

解决方案

方法1:自定义SSL上下文(推荐,仅针对当前请求生效)

通过创建自定义的HTTP适配器,临时降低SSL安全等级,允许使用短DH密钥。这种方法只影响当前的Requests会话,不会全局降低系统安全:

import requests
from requests.adapters import HTTPAdapter
from urllib3.poolmanager import PoolManager
from urllib3.util.ssl_ import create_urllib3_context

# 设置放宽安全等级的加密套件规则
CIPHERS = "DEFAULT:@SECLEVEL=1"

class CustomSSLAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        # 创建自定义SSL上下文
        ssl_context = create_urllib3_context(ciphers=CIPHERS)
        kwargs['ssl_context'] = ssl_context
        return super().init_poolmanager(*args, **kwargs)

def main():
    URL = 'https://192.168.1.20/login.cgi?uri=/index.html'
    # 创建会话并挂载自定义适配器
    session = requests.Session()
    session.mount('https://', CustomSSLAdapter())
    # 关闭证书验证(路由器一般使用自签证书)
    response = session.get(URL, verify=False)
    print(response.status_code)
    print(response.text[:500])  # 打印部分响应内容验证请求是否成功

if __name__ == "__main__":
    main()

方法2:修改全局OpenSSL配置(不推荐)

如果是Linux/macOS系统,可以修改OpenSSL的全局配置文件/etc/ssl/openssl.cnf,在[system_default_sect]段落添加以下内容:

MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1

Windows系统则需要找到OpenSSL的配置文件(通常在C:\Program Files\OpenSSL-Win64\bin\openssl.cfg)进行相同修改。

注意:这种方法会降低所有依赖OpenSSL的程序的安全等级,存在潜在风险,仅在万不得已时使用。

方法3:升级路由器固件(最优解)

最安全的解决方式是检查路由器厂商的固件更新。新版本固件通常会修复这类安全缺陷,使用符合标准的密钥长度,从根源上解决问题,无需修改代码或降低安全设置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:35:21