首页 > 解决方案 > 尝试加载 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 文件所在路径的字符串。这正是我正在做的,但我得到了这个错误。我很困惑。我在这里做错了什么?

提前致谢!

标签: python-2.7sslssl-certificateurllib2firewall

解决方案


.load_cert_chain不是静态方法。您需要实例化一个SSLContext对象。在最简单的情况下,这可以通过以下方法完成

ctx = ssl.create_default_context()

和那个

ctx.load_default_certs()

然后,您可以按以下方式使用它:

url_obj = urllib2.urlopen(req, context=ctx)

推荐阅读