python-2.7 - 尝试加载 SSL 证书:描述符“load_cert_chain”需要一个“_ssl._SSLContext”对象但收到一个“str”
问题描述
我正在尝试加载证书以在下载某些文件时绕过我们的公司防火墙。我使用 urllib2 下载这些文件,并尝试添加证书作为上下文。这曾经工作了一段时间,但现在不再有效了。我收到以下错误:
TypeError: descriptor 'load_cert_chain' requires a '_ssl._SSLContext' object but received a 'str'
Python 网站上的文档说明如下:
SSL上下文。load_cert_chain (certfile, keyfile=None, password=None)
加载私钥和相应的证书。certfile 字符串必须是 PEM 格式的单个文件的路径,该文件包含证书以及建立证书真实性所需的任意数量的 CA 证书。keyfile 字符串(如果存在)必须指向包含私钥的文件。否则私钥也将从 certfile 中获取。有关证书如何存储在 certfile 中的更多信息,请参阅证书的讨论。
我的代码如下:
cert = SSLContext.load_cert_chain('<abs_path_to_PEM_file>')
scheme, netloc, path, params, query, frag = urlparse(url)
auth, host = urllib2.splituser(netloc)
if auth:
url = urlunparse((scheme, host, path, params, query, frag))
req = urllib2.Request(url)
base64string = base64.encodestring(auth)[:-1]
basic = "Basic " + base64string
req.add_header("Authorization", basic)
else:
req = urllib2.Request(url)
url_obj = urllib2.urlopen(req, context=cert)
with open(tmp_path, 'wb') as fp:
fp.write(url_obj.read())
return tmp_path, url_obj.info()
它在那里说 certfile 参数应该是 PEM 文件所在路径的字符串。这正是我正在做的,但我得到了这个错误。我很困惑。我在这里做错了什么?
提前致谢!
解决方案
.load_cert_chain
不是静态方法。您需要实例化一个SSLContext
对象。在最简单的情况下,这可以通过以下方法完成
ctx = ssl.create_default_context()
和那个
ctx.load_default_certs()
然后,您可以按以下方式使用它:
url_obj = urllib2.urlopen(req, context=ctx)
推荐阅读
- python - 我如何知道 python 安全数据库中包含哪些库
- python - 为什么在 Sublime Text 中导入 Pytorch 会导致 ModuleNotFoundError?
- c# - 在 WPF 中渲染视图时显示消息
- c# - 无法正常工作的路线总是返回同一页面
- angular - 固定工具栏上的表格按钮
- angular - 为什么 renderer.listen 不会触发变化检测?
- python - 删除 * 之前的字符串并将您的排序代码及其值作为 JSON 对象获取
- qt - 如何在不添加滚动条的情况下设置 QScrollArea(在 QDialog 内)将展开的最大宽度?
- c# - tfs 上的 JwtSecurityTokenHandler 引用未知
- java - Java 期待“类名 { () {”。注意第一个 {