Python 2.7 试图加载SSL证书:描述符';加载证书链&x27;需要一个'_ssl._SSLContext';对象,但收到一个';str';
我试图加载证书,以便在下载某些文件时绕过公司防火墙。我使用urllib2下载这些文件,并尝试添加一个证书作为上下文。这曾经有用一段时间,但现在不再有用了。我得到以下错误: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_
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解释器中试用后,它似乎起了作用。如果没有您的帮助,我不知道该怎么办。