Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将请求与TLS一起使用不会';我不支持SNI_Python_Ssl_Ssl Certificate_Python Requests_Sni - Fatal编程技术网

Python 将请求与TLS一起使用不会';我不支持SNI

Python 将请求与TLS一起使用不会';我不支持SNI,python,ssl,ssl-certificate,python-requests,sni,Python,Ssl,Ssl Certificate,Python Requests,Sni,我正在使用请求与django应用程序通信,但是 当我尝试 requests.get('https://mysite.com', verify=True) 我得到一个错误: 主机名“mysite.com”与“*.myhost.com”、“myhost.com”均不匹配 然而,当我看浏览器或证书时,它看起来很漂亮 我的主持人暗示这是因为缺少来自请求的SNI支持(Github似乎证实了这一点)。有人找到了使用请求的方法吗?当前版本的请求应该可以使用SNI。您可以看到以下要求: 尝试安装这些

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

当我尝试

requests.get('https://mysite.com', verify=True)
我得到一个错误:

主机名“mysite.com”与“*.myhost.com”、“myhost.com”均不匹配

然而,当我看浏览器或证书时,它看起来很漂亮


我的主持人暗示这是因为缺少来自请求的SNI支持(Github似乎证实了这一点)。有人找到了使用请求的方法吗?

当前版本的请求应该可以使用SNI。您可以看到以下要求:

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

编辑:从请求v2.12.1开始,不再需要ndg HttpScClient和pyasn1。所需软件包的完整列表现在为:

  • pyOpenSSL
  • 伊德纳

@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

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

  • yum安装libffi-devel
  • yum安装gcc
  • yum安装openssl-devel
  • pip安装urllib3
  • pip安装pyopenssl
  • pip安装ndg httpsclient
  • pip安装pyasn1

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

“Python3.4的整个ssl模块已经为Python2.7.9进行了后端口。有关合理性,请参阅PEP 466。”


像这样安装请求模块。这将安装安全软件包extras

pip安装请求[安全性]

在MAC High Sierra和Python 3.6.4上,我尝试了解决方案:首先,不幸的是,它对我不起作用,然后我尝试了 ,终于成功了

作者解释了自述部分中的所有内容,并提供了一个示例脚本,可以很容易地遵循

1.通过
pip安装请求[security]forcediphttpAdapter安装库

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”。

我编辑了Lukasa答案(正确的答案),以便在旧请求中提供SNI支持,以防您无法使用最新的github版本。请确保您的系统中安装了所需的依赖项(不仅是python依赖项,还包括openssl依赖项)。一旦编辑被审查,它将可用:)我认为最好创建一个新的答案,而不是在某人的帖子中执行重拨编辑。他的答案是正确的,所以我认为在另一个案例中有另一个答案并不好,就我个人而言,我真的更喜欢一个包含所有信息的答案。但我会发布另一个答案。好奇的是,你用什么操作系统来测试这个?用Ubuntu精确但不清晰地点击SNI主机对我来说是有效的,我不知道为什么。非常感谢。我还看到了这个拉取请求,它与安装urllib3、ndg httpsclient和pyasn1一起解决了这个问题。@qarma提到的bug正在被跟踪,并且已经在master中修复。这个修复程序还在工作吗?我得到
[Errno bad handshake][(“SSL例程”、“SSL3\u获取服务器\u证书”、“证书验证失败”)]
。此修复程序仍在运行。证书似乎无效。正如您所知,您的答案在页面末尾的-中引用。在进行pip安装之前,我还必须安装:yum install python devel。实际上,对我来说,ndg httpsclient安装了除urllib3之外的所有python包。但是请注意,要获得最新版本的pip,否则它将无法工作。@ihue这些安装在几年前就需要,以避免标准库中的Python SSL模块不支持SNI这一事实。情况不再是这样,使用最新版本的Python 2或3不需要这些额外的安装。我不断收到
请求。异常。SSLError:[SSL:SSLV3\u ALERT\u HANDSHAKE\u FAILURE]SSLV3 ALERT HANDSHAKE FAILURE(\u SSL.c:590)
我有
Python 2.7.10
注意,这现在需要setuptools生锈和生锈支持。