当我尝试时
requests.get('https://mysite.com', verify=True)
我收到错误:
主机名“mysite.com”与“*.myhost.com”、“myhost.com”都不匹配但是,当我查看浏览器或
http://www.digicert.com/help/时,证书看起来不错。
我的主机表示这是请求缺乏 SNI 支持(Github 似乎证实了这一点https://github.com/kennethreitz/requests/issues/749)。有没有人找到使用请求的解决方法?
再往下看GitHub问题你可以看到要求:
尝试安装这些软件包,然后再试一次。
编辑:从 Requests v2.12.1 开始,不再需要 ndg-httpsclient 和 pyasn1。所需软件包的完整列表现在是:
pip install requests[security]
如果出于部署原因,您更喜欢 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
requests toolbelt:HostHeaderSSLAdapter 1st,不幸的是,它对我不起作用,然后我尝试了 forcediphttpsadapter,终于可以用了。
作者在自述文件部分解释了所有内容,并提供了示例脚本,可以轻松遵循。1.通过
pip install requests[security] forcediphttpsadapter
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)
注意:在某些情况下,您可能需要从网址中删除前缀:“www”。
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)
使用 python 3.11.5 和 requests 2.31.0。将 requests lib 降级到 2.28.2 后,当使用 verify=False 时,一切都按预期工作。