【问题标题】:Why does Python requests ignore the verify parameter?为什么 Python 请求会忽略 verify 参数?
【发布时间】:2015-12-15 13:00:26
【问题描述】:

问题

我一直在尝试使用Python的requests包下载如下网址:

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

在 Chrome 中,证书似乎有效:

但是,在 Python 中,请求会以 SSLV3_ALERT_HANDSHAKE_FAILURE 失败,即使 using the verify flag 会忽略错误的证书:

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

堆栈跟踪

>>> 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)

环境

操作系统和软件包

我在 OSX 的虚拟环境中使用 requests 2.7.0 和 Python 2.7.10。

卷曲

在同一台机器上对相同 URL 的 cURL 调用可以正常工作:

 $ 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=/

【问题讨论】:

  • 请注意,verify=False 忽略无效证书。这不是无效证书问题,这是握手失败,验证可能已经通过。
  • @MartijnPieters 对!错过了。知道为什么会失败吗?
  • 只是一个模糊的提示:我很久以前遇到过类似的问题:尝试使用特定的ssl_version(尝试多个版本):docs.python-requests.org/en/latest/user/advanced/…
  • 谢谢。我想我会简单地尝试另一个包。

标签: ssl ssl-certificate python-requests


【解决方案1】:

结合 OpenSSL 升级和安装 ndg-httpsclient 为我解决了这个问题

sudo pip install ndg-httpsclient

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

【讨论】:

    【解决方案2】:

    我在 macOS Sierra、Python 2.7.9 上也遇到过这个问题,它由以下人员修复:

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

    这可能是由于 pyOpenSSL 太旧了。

    【讨论】:

      【解决方案3】:

      证书验证没有失败,因此verify 参数不适用于此处。失败的是密码协商;没有一个密码 requests 愿意使用与服务器愿意使用的密码匹配。

      如果您使用-v 开关运行curl 命令,您将看到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 密码,它有 some rather troublesome securty issues,不应该真正使用;例如,它不提供forward secrecyurllib3 包(与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 保护部分。

      【讨论】:

      • 奇怪的是,它适用于 Ubuntu,而不是 OSX - 知道为什么吗?
      • @AdamMatan:我在 OSX 上对此进行了测试,但是使用从源代码构建的 Python 并使用自制软件为我处理 OpenSSL 库。 requests.packages.urllib3 中包含两个 SSL 库,每个都有自己的字符串副本,我也添加了 pyopenssl 包版本。
      猜你喜欢
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多