64

我正在使用请求与 django 应用程序进行通信,但是

当我尝试

requests.get('https://mysite.com', verify=True)

我得到错误:

主机名“mysite.com”与“*.myhost.com”、“myhost.com”中的任何一个都不匹配

但是,当我查看浏览器或http://www.digicert.com/help/时,证书看起来又好又漂亮。

我的主人认为这是请求缺乏 SNI 支持(Github 似乎证实了这一点https://github.com/kennethreitz/requests/issues/749)。有没有人找到使用请求的解决方法?

4

6 回答 6

129

当前版本的 Requests 应该可以与 SNI 配合使用。在 GitHub 问题的下方,您可以看到要求:

尝试安装这些软件包,然后再试一次。

编辑:从 Requests v2.12.1 开始,不再需要 ndg-httpsclient 和 pyasn1。所需软件包的完整列表现在是:

于 2013-09-02T19:12:07.960 回答
22

为了让我得到公认的工作答案,我必须按以下顺序安装一堆其他软件包:

  • 百胜安装 libffi-devel
  • 百胜安装 gcc
  • 百胜安装 openssl-devel
  • 点安装 urllib3
  • 点安装 pyopenssl
  • pip install ndg-httpsclient
  • 点安装pyasn1
于 2014-10-15T22:00:49.687 回答
12

像这样安装请求模块。这将安装额外的安全包。

pip install requests[security]

于 2017-02-03T16:38:27.990 回答
6

或者您可以只使用 Python 2.7.9 及更高版本:

“Python 3.4 的全部 ssl 模块已被向后移植到 Python 2.7.9。有关理由,请参见 PEP 466。”

https://www.python.org/downloads/release/python-279/

于 2015-07-30T21:03:41.423 回答
4

@Lukasa 对当前(来自 github)请求的回答是正确的。除了他提到的 pip 依赖项之外,请记住在您的系统中添加 OpenSSL。

如果出于部署原因,您更喜欢 pip 中的 1.2.3 之类的稳定请求版本,您可以修改该版本以与 SNI 一起使用,如下所示:

import requests


def fileno(self):
    return self.socket.fileno()


def close(self):
    return self.connection.shutdown()


requests.pyopenssl.WrappedSocket.close = close
requests.pyopenssl.WrappedSocket.fileno = fileno
于 2013-09-04T16:03:15.443 回答
2

从使用 IP 地址访问 https 站点中复制我的答案

在 MAC High Sierra 和 Python 3.6.4 上,我尝试了解决方案:requests toolbelt:HostHeaderSSLAdapter 1st,不幸的是,它对我不起作用,然后我尝试 了forceiphttpsadapter,终于成功了。

作者在自述文件部分解释了所有内容,并提供了一个示例脚本,可以轻松遵循。

1.安装库pip install requests[security] forcediphttpsadapter

2.运行示例脚本:

import requests
from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter
session = requests.Session()
session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4'))
response = session.get(
    '/some/path', headers={'Host': 'example.com'}, verify=False)

注意:在某些情况下,您可能需要从 url 中删除前缀:'www'。

于 2018-07-22T07:57:35.233 回答