【问题标题】:ssl.CertificateError: hostname 'example.com' doesn't match either of 'exampleserver.com'?ssl.CertificateError:主机名“example.com”与“exampleserver.com”中的任何一个都不匹配?
【发布时间】:2020-08-06 09:19:15
【问题描述】:

当我尝试使用 urllib 库打开网站时,我遇到了错误。我不明白为什么会发生此错误?目前我正在使用 python 3.6 版本。是版本问题吗?

url = 'https://example.com'
html = urllib.request.urlopen(url).read().decode('utf-8')
text = get_text(html)
data = text.split()
print(data)

【问题讨论】:

    标签: python-3.x ssl-certificate urllib urllib2 urllib3


    【解决方案1】:

    我已经通过这段代码解决了:

    需要导入ssl库

    导入 ssl

    需要在加载url之前添加这段代码

    ssl.match_hostname = lambda 证书,主机名:真

    例子:

    import ssl
    
    ssl.match_hostname = lambda cert, hostname: True
    url = 'https://example.com'
    html = urllib.request.urlopen(url).read().decode('utf-8')
    text = get_text(html)
    data = text.split()
    print(data)
    

    【讨论】:

    • 所以基本上你在每种情况下都返回 true。从安全的角度来看,这可能是有风险的。您至少应该检查有效证书及其到期时间。
    • 如何检查证书是否有效?
    • 似乎在 python 中,我们有单独的处理程序来检查证书到期和主机名。所以,无论你做什么都是正确的。您无需在此处验证证书。有单独的回调“cert_time_to_seconds(cert_time)”被调用以验证证书。
    【解决方案2】:

    当您的 SSL/TLS 证书的公用名与您网站的域名不匹配时,会发生此错误。尝试将您的站点的域名更改为 exampleServer.Com 并查看它是否有效。否则,您将不得不编写自定义逻辑来忽略名称不匹配错误。

    【讨论】:

    • 自定义逻辑包括“try block”以避免错误?
    • 我不确定python。但通常在每个框架中,都有回调方法在 SSL 握手发生时被调用。默认情况下,此方法仅在所有验证通过时才返回 true。但是,您可以编写自己的逻辑来忽略名称不匹配错误并从此方法返回 true。可以在 Python 中搜索这个回调方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2017-12-26
    • 2021-05-24
    • 1970-01-01
    • 2015-03-14
    • 2020-02-04
    相关资源
    最近更新 更多