Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 试图加载SSL证书:描述符';加载证书链&x27;需要一个'_ssl._SSLContext';对象,但收到一个';str';_Python 2.7_Ssl_Ssl Certificate_Urllib2_Firewall - Fatal编程技术网

Python 2.7 试图加载SSL证书:描述符';加载证书链&x27;需要一个'_ssl._SSLContext';对象,但收到一个';str';

Python 2.7 试图加载SSL证书:描述符';加载证书链&x27;需要一个'_ssl._SSLContext';对象,但收到一个';str';,python-2.7,ssl,ssl-certificate,urllib2,firewall,Python 2.7,Ssl,Ssl Certificate,Urllib2,Firewall,我试图加载证书,以便在下载某些文件时绕过公司防火墙。我使用urllib2下载这些文件,并尝试添加一个证书作为上下文。这曾经有用一段时间,但现在不再有用了。我得到以下错误: TypeError: descriptor 'load_cert_chain' requires a '_ssl._SSLContext' object but received a 'str' Python网站上的文档说明如下: cert = SSLContext.load_cert_chain('<abs_

我试图加载证书,以便在下载某些文件时绕过公司防火墙。我使用urllib2下载这些文件,并尝试添加一个证书作为上下文。这曾经有用一段时间,但现在不再有用了。我得到以下错误:

TypeError: descriptor 'load_cert_chain' requires a '_ssl._SSLContext' object but received a 'str'
Python网站上的文档说明如下:

    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()
url_obj = urllib2.urlopen(req, context=ctx)
SSLContext.加载证书链(证书文件,密钥文件=无,密码=无)

加载私钥和相应的证书。certfile字符串必须是PEM格式的单个文件的路径,其中包含证书以及建立证书真实性所需的任意数量的CA证书。keyfile字符串(如果存在)必须指向中包含私钥的文件。否则,私钥也将从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()
url_obj = urllib2.urlopen(req, context=ctx)
cert=SSLContext.load\u cert\u chain(“”)
scheme,netloc,path,params,query,frag=urlparse(url)
auth,host=urllib2.splituser(netloc)
如果授权:
url=urlunparse((方案、主机、路径、参数、查询、frag))
请求(url)
base64string=base64.encodestring(auth)[:-1]
basic=“basic”+base64字符串
请求添加标题(“授权”,基本)
其他:
请求(url)
url_obj=urllib2.urlopen(请求,上下文=cert)
打开(tmp_路径,“wb”)作为fp:
fp.write(url\u obj.read())
返回tmp_路径,url_obj.info()
它说certfile参数应该是PEM文件所在路径的字符串。这正是我正在做的,但我得到了这个错误。我很困惑。我做错了什么


提前谢谢

.load\u cert\u chain
不是静态方法。您需要实例化一个
SSLContext
对象。在最简单的情况下,这可以通过以下方法实现

ctx = ssl.create_default_context()
而且

ctx.load_default_certs()
然后,您可以按如下方式使用:

    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()
url_obj = urllib2.urlopen(req, context=ctx)

显示您的代码。。。错误消息不是关于
certfile
。另外,您的标题与错误消息不匹配,因此您的问题中有一些奇怪的地方。除了您使用的代码之外,您还可以在出现问题时自己转储变量,看看它们是否真的是您所认为的那样。@PatrickMevzek很抱歉造成混淆,我尝试了不同类型的参数。我已经添加了代码,根据文档,应该可以了。这不是tho:(谢谢@Axel,这实际上是有道理的。在Python解释器中试用后,它似乎起了作用。如果没有您的帮助,我不知道该怎么办。