使用TLS请求不支持SNI

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

当我尝试

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

我得到的错误:

主机名“mysite.com”与“* .myhost.com”,“myhost.com”

但是,当我浏览器,或http://www.digicert.com/help/证书看起来很好,花花公子。

我的主机build议,由于缺乏来自请求的SNI支持(Github似乎确认https://github.com/kennethreitz/requests/issues/749 )。 有没有人find使用请求的解决方法?

SNI的当前版本的要求应该没问题。 再往下看GitHub的问题,你可以看到需求:

  • pyOpenSSL
  • NDG-httpsclient
  • pyasn1

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

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

  • pyOpenSSL
  • IDNA

为了让我得到可以接受的答案,我必须按照以下顺序安装一堆其他软件包:

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

像这样安装请求模块。 这将安装安全套件。

pip install requests[security]

或者你可以使用Python 2.7.9及以上版本:

“Python 3.4的ssl模块的整体已经被Python 2.7.9反向移植,见PEP 466的理由。

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

@Lukasa的答案是正确的(来自github)的请求。 请记住,除了他提到的pip依赖关系之外,还要在系统中添加OpenSSL。

如果由于部署的原因,你更喜欢一个稳定的请求版本像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