为什么Python的请求忽略验证参数?为什么Python的请求忽略验证参数?(Why does Py

2019-05-12 10:29发布

问题

我一直在尝试使用Python的请求包下载以下网址:

https://service.isracard.co.il/I_logon.jsp

在Chrome中,证书有效期看来:

然而,在Python,请求失败, SSLV3_ALERT_HANDSHAKE_FAILURE ,即使当使用verify标志而忽略错误的证书:

请求也可以忽略验证SSL证书,如果你设置验证为False

堆栈跟踪

>>> requests.__version__
'2.7.0'
>>> LOGIN_URL = 'https://service.isracard.co.il/I_logon.jsp'
>>> requests.get(LOGIN_URL, verify=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/api.py", line 69, in get
    return request('get', url, params=params, **kwargs)
  File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)

环境

OS和包

我使用在OSX虚拟环境的要求2.7.0和Python 2.7.10。

卷曲

在同一台机器上相同的URL卷曲电话正常工作:

 $ curl -I https://service.isracard.co.il/I_logon.jsp
HTTP/1.1 200 OK
Date: Fri, 18 Sep 2015 11:37:27 GMT
Server: IBM_HTTP_Server
X-Powered-By: Servlet/3.0
Set-Cookie: JSESSIONID=0000R90MxFKBVxBMV665syGfjnh:-1; Path=/; HttpOnly
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
Set-Cookie: Alt50_ZLinuxPrd=94742720.30755.0000; expires=Fri, 18-Sep-2015 12:07:19 GMT; path=/
Content-Type: text/html; charset=ISO-8859-8
Content-Language: iw-IL
Set-Cookie: ServiceP=53323968.20480.0000; path=/

Answer 1:

证书验证没有失败,所以verify的说法在这里并不适用。 什么是失败的密码协商; 没有密码的requests愿意用匹配的服务器是愿意使用。

如果你运行你的curl用命令-v开关,你会看到什么密码套件是通过谈判curl的成功的连接:

$ curl -v -I https://service.isracard.co.il/I_logon.jsp
* Hostname was NOT found in DNS cache
*   Trying 192.118.12.8...
* Connected to service.isracard.co.il (192.118.12.8) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_RC4_128_SHA
[ .... ]

这就是RC4-SHA密码,里面有一些比较麻烦的securty问题 ,应该没有真正被使用; 它没有提供前向安全性的例子。 所述urllib3包(使用捆绑requests由从默认密码加密器默认排除 )。 你可以将其重新添加:

import requests

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':RC4-SHA'
try:
    requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += ':RC4-SHA'
except AttributeError:
    # no pyopenssl support used / needed / available
    pass

和您的要求的工作:

>>> import requests
>>> requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':RC4-SHA'
>>> requests.get('https://service.isracard.co.il/I_logon.jsp')
<Response [200]>

所以我没有打扰与我没有安装pyOpenSSL包try..except把守的一部分。



Answer 2:

我在MacOS塞拉利昂,Python的2.7.9碰到这个问题,以及它是由固定的:

须藤PIP安装 - 忽略安装pyOpenSSL --upgrade

这可能是由于pyOpenSSL太旧。



Answer 3:

OpenSSL的组合升级和安装ndg-httpsclient解决它为我

sudo pip install ndg-httpsclient

sudo pip install --ignore-installed pyOpenSSL --upgrade



文章来源: Why does Python requests ignore the verify parameter?