如何解决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
相关产品推荐
相关产品推荐

