带有自签名证书的 Python 3 urllib

新手上路,请多包涵

我正在尝试使用 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 包。

原文由 vaFyreHeart 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

原文由 Muhammad Tahir 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用以下内容禁用 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");

原文由 Sanj 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题