我正在使用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)这在Cygwin、Windows和OSX中都会发生。我的研究暗示了服务器上过时的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)发布于 2016-06-24 14:58:02
禁用警告或证书验证无助于此。底层问题是服务器使用的弱DH密钥,它可能在Logjam攻击中被滥用。
要解决这个问题,您需要选择一个不使用Diffie密钥交换的密码,因此不受弱DH密钥的影响。这个密码必须得到服务器的支持。服务器支持什么是未知的,但是您可以尝试使用密码AES128-SHA或密码集HIGH:!DH:!aNULL。
使用您自己的密码集的请求是很棘手的。有关示例,请参见为什么Python请求忽略验证参数?。
发布于 2016-12-08 13:45:31
这不是额外的答案,只要尝试将问题中的解决方案代码与额外的信息结合起来,其他人就可以直接复制它,而不需要额外的尝试。
它不仅是服务器端的DH关键问题,而且在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)发布于 2020-08-10 23:00:53
这也适用于我:
import requests
import urllib3
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL:@SECLEVEL=1'openssl文档:level.html
SECLEVEL=2现在是openssl的缺省值(至少在我的设置中是:Ubuntu20.04,OpenSS1.1.1f);SECLEVEL=1降低了这个值。
安全级别的目的是避免修改单个密码的复杂性。
我相信,我们大多数凡人并不深入了解个人密码的安全强弱,我当然不知道。安全级别似乎是控制你打开安全大门的程度的好方法。
注意:我得到了一个不同的SSL错误,WRONG_SIGNATURE_TYPE而不是SSL_NEGATIVE_LENGTH,但是底层问题是相同的。
错误:
Traceback (most recent call last):
[...]
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 581, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 514, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='somehost.com', port=443): Max retries exceeded with url: myurl (Caused by SSLError(SSLError(1, '[SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:1108)')))https://stackoverflow.com/questions/38015537
复制相似问题