【问题标题】:Python 3 urllib with self-signed certificates带有自签名证书的 Python 3 urllib
【发布时间】:2016-06-22 20:47:08
【问题描述】:

我正在尝试使用 Python 从内部服务器下载一些数据。由于它是内部的,因此它使用自签名证书。 (我们不想为永远不会“在野外”出现的服务器向 Verisign 付费。)Python 2.6 版本的代码运行良好。

response = urllib2.urlopen(URL)
data = csv.reader(response)

我现在正在尝试更新到 Python 3.4(说来话长,别问了。)但是,使用 Python 3 的 urllib 失败了:

response = urllib.request.urlopen(URL)

它会引发 CERTIFICATE_VERIFY_FAILED 错误。

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

在网上阅读时,显然 Python 2.6 urllib2 不会费心验证证书。某些版本的 urllib 允许将“verify=False”传递给方法签名,但这似乎不适用于 Python 3.4。

有谁知道我该如何解决这个问题?出于公司安全准则的考虑,我想避免使用 Requests 包。

【问题讨论】:

  • 使用letsencrypt获取免费真实证书...

标签: python python-3.x ssl urllib self-signed


【解决方案1】:

urllib.request.urlopen 有一个上下文关键字参数,它接受一个SSLContext 对象。因此,传递 SSLContext 对象并将 .verify_mode 设置为 ssl.CERT_NONESSLContext.verify_mode = ssl.CERT_NONE 应该等于 verify=False

【讨论】:

    【解决方案2】:

    使用以下内容禁用 URL 的 SSL 证书验证

    import ssl
    myssl = ssl.create_default_context();
    myssl.check_hostname=False
    myssl.verify_mode=ssl.CERT_NONE
    urlopen("URL",context=myssl)
    

    使用以下方法禁用所有 URL 的 SSL 证书验证

     ssl._create_default_https_context = ssl._create_unverified_context
     urlopen("URL");
    

    【讨论】:

      【解决方案3】:

      urllib3:

      import urllib3
      
      urllib3.disable_warnings()
      
      http.request('GET', 'https://example.org')
      

      【讨论】:

        猜你喜欢
        • 2014-05-05
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 2021-10-22
        相关资源
        最近更新 更多