使用TLS请求不会提供SNI支持

Mas*_*ran 61 python ssl ssl-certificate sni python-requests

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

当我尝试

requests.get('https://mysite.com', verify=True)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

主机名'mysite.com'与'*.myhost.com','myhost.com'不匹配

但是,当我查看浏览器或http://www.digicert.com/help/时,证书看起来很精致和花花公子.

我的主持人建议缺少SNI支持请求(Github似乎确认https://github.com/kennethreitz/requests/issues/749).有没有人找到使用请求的解决方法?

Luk*_*asa 125

SNI的当前版本的请求应该没问题.在GitHub问题的下面,您可以看到要求:

尝试安装这些包,然后再给它一个镜头.

编辑:自请求v2.12.1起,不再需要ndg-httpsclient和pyasn1.现在所需包的完整列表:

  • pyOpenSSL
  • IDNA

  • 这个修复程序仍在运行吗?我得到``[Errno bad handshake] [('SSL例程','SSL3_GET_SERVER_CERTIFICATE','证书验证失败')]``. (4认同)
  • 谢谢.我也看到了这个请求https://github.com/kennethreitz/requests/pull/1347,它与安装urllib3,ndg-httpsclient和pyasn1一起解决了它. (3认同)

Sha*_*e N 22

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

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

  • 我还必须安装:yum install python-devel才能进入pip安装.. (2认同)

Nan*_*esh 11

像这样安装请求模块.这将安装安全包附加功能.

pip install requests[security]


sta*_*onk 6

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

"整个Python 3.4的ssl模块已经被反向移植到Python 2.7.9.请参阅PEP 466以获得理由."

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

  • 我一直得到`requests.exceptions.SSLError:[SSL:SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3警报握手失败(_ssl.c:590)`我有`Python 2.7.10` (4认同)

Ant*_*oMO 5

@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
Run Code Online (Sandbox Code Playgroud)