为啥 Python 的“请求”拒绝我的 SSL 证书,浏览器接受
Posted
技术标签:
【中文标题】为啥 Python 的“请求”拒绝我的 SSL 证书,浏览器接受【英文标题】:Why does Python's `requests` reject my SSL certificate, which browsers accept为什么 Python 的“请求”拒绝我的 SSL 证书,浏览器接受 【发布时间】:2014-06-03 13:36:07 【问题描述】:我最近为我的网站获得了 SSL 证书:
https://ram.rachum.com/
它在浏览器中运行良好。但是requests
失败了:
>>> import requests
>>> requests.get('https://ram.rachum.com')
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
requests.get('https://ram.rachum.com')
File "C:\Python27\lib\site-packages\requests\api.py", line 55, in get
return request('get', url, **kwargs)
File "C:\Python27\lib\site-packages\requests\api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 354, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 460, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 250, in send
raise SSLError(e)
SSLError: hostname 'ram.rachum.com' doesn't match either of '*.webfaction.com', 'webfaction.com'
为什么?为什么requests
看的是webfaction证书而不是我自己的证书,对ram.rachum.com
有效?
【问题讨论】:
【参考方案1】:您正在使用不支持 SNI(服务器名称指示)的请求库,但您在同一个 IP 地址后面有多个 SSL 证书,这需要 SNI。您可以使用openssl s_client
验证这一点。如果没有为 SNI 提供名称,服务器只会提供此 IP 的默认证书,即 *.webfaction.com:
openssl s_client -connect ram.rachum.com:443
...
0 ...CN=*.webfaction.com
但如果您为 SNI 指定主机名,它会返回预期的证书:
openssl s_client -connect ram.rachum.com:443 -servername ram.rachum.com
...
0 ...CN=ram.rachum.com...
也许您还需要升级您的请求库和其他模块,请参阅using requests with TLS doesn't give SNI support
【讨论】:
我也使用 webfaction,收到相同的错误消息,购买了静态 IP 升级(+5 美元/月),但错误仍然存在。想法? @MarcMaxson:请不要在一些旧答案中提问。最好打开一个包含足够详细信息(如域名)的新问题。以上是关于为啥 Python 的“请求”拒绝我的 SSL 证书,浏览器接受的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我将查询字符串添加到我的 url 时,它会被 xampp 拒绝(“在此服务器上找不到请求的 URL”)