Python - requests.exceptions.SSLError - dh key 太小

标签 python ssl python-requests

我正在使用 Python 和请求抓取一些内部页面。我已经关闭了 SSL 验证和警告。

requests.packages.urllib3.disable_warnings()
page = requests.get(url, verify=False)

在某些服务器上,我收到无法通过的 SSL 错误。

Traceback (most recent call last):
  File "scraper.py", line 6, in <module>
    page = requests.get(url, verify=False)
  File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/api.py", line 71, in get
    return request('get', url, params=params, **kwargs)
  File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/api.py", line 57, in request
    return session.request(method=method, url=url, **kwargs)
  File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/sessions.py", line 585, in send
    r = adapter.send(request, **kwargs)
  File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/adapters.py", line 477, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSL_NEGATIVE_LENGTH] dh key too small (_ssl.c:600)

在 Windows 和 OSX 中,这在 Cygwin 内外都会发生。我的研究暗示服务器上有过时的 OpenSSL。我正在理想地寻找修复客户端。

编辑: 我能够通过使用密码集来解决这个问题

import requests

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL'
try:
    requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += 'HIGH:!DH:!aNULL'
except AttributeError:
    # no pyopenssl support used / needed / available
    pass

page = requests.get(url, verify=False)

最佳答案

这不是一个额外的答案只是尝试将问题的解决方案代码与额外信息结合起来 这样其他人就可以直接复制它而无需额外尝试

这不仅是服务器端的 DH Key 问题,还有很多不同的库在 python 模块中不匹配。

下面的代码段用于忽略那些安全问题,因为它可能无法在服务器端解决。例如,如果它是内部遗留服务器,则没有人愿意更新它。

除了 'HIGH:!DH:!aNULL' 的黑客字符串外,urllib3如果有,可以导入模块以禁用警告

import requests
import urllib3

requests.packages.urllib3.disable_warnings()
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
try:
    requests.packages.urllib3.contrib.pyopenssl.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
except AttributeError:
    # no pyopenssl support used / needed / available
    pass

page = requests.get(url, verify=False)

关于Python - requests.exceptions.SSLError - dh key 太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38015537/

相关文章:

python - Appengine SDK 1.7.3 未检测到更新的文件

python - 如何使用Python请求转到主机的特定路径?

python - 如何使用 Selenium 和 Python 提取下拉菜单所选选项的文本

Python HTTP SSL 服务器接受连接速度慢

php - WebSocket 错误:net::ERR_SSL_PROTOCOL_ERROR

docker - 如何使用自签名证书通过 TLS 将 Docker 应用程序包推送到私有(private)注册表

python - 为什么我无法在 python 中 ping docker 容器?

python - Python 3.7错误: Unsupported Pickle Protocol 5

python - 请求 - 获取内容类型/大小而不获取整个页面/内容

python - 如何使用请求测量下载速度和进度?