📌  相关文章
📜  urllib.error.urlerror:<urlopen error [ssl: certificate_verify_failed] certificate verify failed (_ssl.c:852)> (1)

📅  最后修改于: 2023-12-03 15:05:46.469000             🧑  作者: Mango

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>

这错误通常发生在使用 urllib 或者 urllib2 这类 Python 官方库进行 HTTPS 请求的时候,通常是因为请求的网站的 SSL 证书未被认可。

原因
  • 当请求的 HTTPS 网站的 SSL 证书不被 Python 所使用的 OpenSSL 所认可时会出现该错误。
  • SSL 证书可能已经过期、被吊销、被冒名申请等原因导致 SSL 证书无效。
解决方案
  1. 忽略证书验证 (不推荐)

    可以使用 ssl._create_unverified_context() 来忽略证书验证,但这种做法不安全,因为可能遭受中间人攻击。

    import ssl
    import urllib.request
    
    context = ssl._create_unverified_context()
    response = urllib.request.urlopen(url, context=context)
    print(response.status_code)
    
  2. 安装SSL证书或者CA证书

    为了验证有效的证书,我们需要将证书提供机构(CA)的根证书添加到 OpenSSL 的根证书列表中。可以通过参考证书提供机构的官方文档或者使用 certifi 模块来安装 SSL 证书或者 CA 证书。

    import ssl
    import certifi
    import urllib.request
    
    # 安装 SSL 证书
    ssl_context = ssl.create_default_context(cafile=certifi.where())
    response = urllib.request.urlopen(url, context=ssl_context)
    print(response.status_code)
    
  3. 关闭SSL

    彻底解决 SSL 证书问题的另一种方法是修改网站的服务器配置,停用 SSL 或者采用有效的证书,但是这种方法可能会影响网站的可用性。

    import ssl
    import urllib.request
    
    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
    context.verify_mode = ssl.CERT_NONE
    response = urllib.request.urlopen(url, context=context)
    print(response.status_code)
    

以上是常见的解决方法,但实际情况可因实际情况而不同。了解以上的方法可以帮助你解决类似的问题。