Python 3上的urllib.request无法获取证书

2024-09-30 01:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序,可以在python3中读取ipsw.me的json:

import urrlib.request as ur
url = "https://api.ipsw.me/v4/device/" + device
json_file = ur.urlopen(url)
with open("signedipsw.json",'wb') as output:
    output.write(json_file.read())

    data = json.load(open("signedipsw.json"))
    i = 0
    with open("signedipsw.json"):
        print("signed firmwares for %s:" % device)
        for i in range(0, len(data["firmwares"])):
            if data["firmwares"][i]["signed"] == True :
                print("%s - %s" % (data["firmwares"][i]["version"], data["firmwares"][i]["buildid"]))
            i+=1
    

我曾经用Python2编写这个,但是我使用了urrlib2模块,它工作得非常好。现在,在Python3上,我使用urrlib.request,但收到一个错误:

    json_file = ur.urlopen(url)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 517, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 534, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 494, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 1385, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 1345, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)>

我怎样才能解决这个问题?谢谢


Tags: inpyjsondatarequestliblinelibrary
1条回答
网友
1楼 · 发布于 2024-09-30 01:26:52

看起来urllib(不是urrlib)无法验证您正在与真实的ipsw.me对话。他们正在使用Cloudflare的证书

您将有一个更好的时间使用请求模块。它附带了一个较新的证书捆绑包,这可能会解决您的问题

import requests

device = "..."

resp = requests.get(f"https://api.ipsw.me/v4/device/{device}")
resp.raise_for_status()
data = resp.json()
print(f"signed firmwares for {device}:")
for fw in data["firmwares"]:
    if fw["signed"]:
        print(f"{fw['version']} - {fw['buildid']}")

相关问题 更多 >

    热门问题