Python 将请求与TLS一起使用不会';我不支持SNI
我正在使用请求与django应用程序通信,但是 当我尝试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。您可以看到以下要求: 尝试安装这些
requests.get('https://mysite.com', verify=True)
我得到一个错误:
主机名“mysite.com”与“*.myhost.com”、“myhost.com”均不匹配
然而,当我看浏览器或证书时,它看起来很漂亮
我的主持人暗示这是因为缺少来自请求的SNI支持(Github似乎证实了这一点)。有人找到了使用请求的方法吗?当前版本的请求应该可以使用SNI。您可以看到以下要求:
- pyOpenSSL
- 伊德纳
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
像这样安装请求模块。这将安装安全软件包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生锈和生锈支持。