为啥 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”)

在 SSL WebSocket 连接 (wss) 中拦截请求

为啥我的应用更新被 Google Play 拒绝了?

Python 使用系统 SSL 证书?

为啥现在的网站都要SSL证书了? 2021年

针对SSL/TLS的拒绝服务攻击以及使用ettercap进行DNS欺骗