使用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的理由。
@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