我正在使用Python和requests抓取一些内部页面。我已关闭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)
我将在这里打包我的解决方案。我不得不修改PythonSSL库,这是可能的,因为我是在docker容器中运行代码的,但这可能是您不想做的事情。
检查支持的密码.sh
授予它权限:
并执行:
几秒钟后,您将看到类似于以下内容的输出:
因此将使用“AES128-SHA”作为SSL密码。
强制代码中的错误:
回溯(最近一次呼叫时间): 文件“my_custom_script.py”,第52行,in imap=IMAP4_SSL(imap_主机) 文件“/usr/lib/python2.7/imaplib.py”,第1169行,在init IMAP4.初始化(自身、主机、端口) 文件“/usr/lib/python2.7/imaplib.py”,第174行,在init self.open(主机、端口) 文件“/usr/lib/python2.7/imaplib.py”,第1181行,打开 self.sslobj=ssl.wrap_套接字(self.sock,self.keyfile,self.certfile) 文件“/usr/lib/python2.7/ssl.py”,第931行,在wrap_socket中 密码=密码) 文件“/usr/lib/python2.7/ssl.py”,第599行,在init 自我。握手() 文件“/usr/lib/python2.7/ssl.py”,第828行,在do廑handshake中 自我。说客。握手() ssl.SSLError:[ssl:DH_KEY_TOO_SMALL]DH KEY TOO SMALL(_ssl.c:727)
获取使用的python SSL库路径,在这种情况下:
/usr/lib/python2.7/ssl.py
编辑它:
cp/usr/lib/python2.7/ssl.py/usr/lib/python2.7/ssl.py.bak
vim/usr/lib/python2.7/ssl.py
并替换:
签署人:
禁用警告或证书验证将无济于事。潜在的问题是服务器使用的弱DH密钥可能在Logjam Attack中被误用。
要解决这个问题,您需要选择一个不使用Diffie-Hellman密钥交换的密码,因此不受弱DH密钥的影响。服务器必须支持这个密码。不知道服务器支持什么,但您可以尝试使用密码
AES128-SHA
或密码集HIGH:!DH:!aNULL
将请求与自己的密码集一起使用是很棘手的。有关示例,请参见Why does Python requests ignore the verify parameter?。
这不是一个额外的答案,试着将问题的解决方案代码与额外的信息结合起来 所以其他人可以直接复制而无需额外尝试
这不仅是服务器端的一个DH关键问题,而且python模块中有很多不同的库是不匹配的。
下面的代码段用于忽略这些安全问题,因为它可能无法在服务器端解决。例如,如果它是内部遗留服务器,则没有人希望更新它。
除了
'HIGH:!DH:!aNULL'
的黑字符串之外,还可以导入urllib3模块以禁用警告相关问题 更多 >
编程相关推荐