【问题标题】: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有效?

【问题讨论】:

    标签: python ssl certificate python-requests


    【解决方案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:请不要在一些旧答案中提问。最好打开一个包含足够详细信息(如域名)的新问题。
    猜你喜欢
    • 2016-09-16
    • 2016-08-24
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多