ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获得本地颁发者证书 (_ssl.c:1056)

mac*_*mac 16 python

我正在使用 Python 3.7.3 对我网站上托管的 PHP 文件运行 GET 请求。但是,当我运行它时,我收到以下错误。我已经安装requestspip3的家酿。我正在使用 macOS Mojave。

回溯(最近一次调用):
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py”,第600行,在urlopen chunked=chunked中)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py”,第 343 行,在 _make_request self._validate_conn(conn)
文件“/Library/Frameworks/Python .framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py”,第 839 行,在 _validate_conn conn.connect()
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib /python3.7/site-packages/urllib3/connection.py”,第 344 行,在连接 ssl_context=context 中)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/util/ssl_.py”,第 344 行,在 ssl_wrap_socket 中
返回 context.wrap_socket(sock, server_hostname=server_hostname)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py”,第 412 行,在 wrap_socket session=session
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib /python3.7/ssl.py”,第 853 行,在 _create self.do_handshake()
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py”,第 1117 行,在do_handshake self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获得本地颁发者证书 (_ssl.c:第1056章)

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用最后一次):
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/adapters.py”,第 449 行,发送超时=超时
文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 638, in urlopen _stacktrace=sys.exc_info()[2])
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/util/retry.py”,第398行,以递增方式引发MaxRetryError(_pool, url, error or ResponseError(原因)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='ijetlab.com', port=443): Max retries exceeded with url: /api/api.php?one=1&two=2 (Caused by SSLError(SSLCertVerificationError(1)) , '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获得本地颁发者证书 (_ssl.c:1056)')))

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用):
文件“/Users/maxwellnewberry/Documents/test.py”,第 12 行,在 r = requests.get(url = URL, params = PARAMS)
文件“/Library/Frameworks/Python.framework /Versions/3.7/lib/python3.7/site-packages/requests/api.py", line 75, in get return request('get', url, params=params, **kwargs)
File "/Library/Frameworks /Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/api.py”,第 60 行,在请求中返回 session.request(method=method, url=url, **kwargs)
文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 533, in request resp = self.send(prep, **send_kwargs)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py”,第 646 行,在发送 r = adapter.send(request, **kwargs)
文件中“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/adapters.py”,第 514 行,在发送中引发 SSLError(e, request=request) requests.exceptions.SSLError : HTTPSConnectionPool(host='ijetlab.com', port=443): Max retries exceeded with url: /api/api.php?one=1&two=2 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate)验证失败:无法获得本地颁发者证书 (_ssl.c:1056)')))

这是代码:

# importing the requests library 
import requests 

# api-endpoint 
URL = "https://ijetlab.com/api/api.php"


# defining a params dict for the parameters to be sent to the API 
PARAMS = {'one':1, 'two':2} 

# sending get request and saving the response as response object 
r = requests.get(url = URL, params = PARAMS) 

# extracting data in json format 
data = r.json()

print(data['response'])
Run Code Online (Sandbox Code Playgroud)

所有搜索都告诉我要运行“安装 Certificates.command”,而我已经运行了大约 100 次。我也让客户安装证书。

Ana*_*man 19

TL; 博士

远程网站似乎是问题所在,而不是 Python。除了修复网站之外,可能没有其他修复方法。

更长的解释

您正在处理的网站/服务器显然配置不正确。这与 Python 没有直接关系。也就是说,您可以忽略任何证书错误,例如:

r = requests.get(url=URL, params=PARAMS, verify=False)
Run Code Online (Sandbox Code Playgroud)

或者您可以尝试将 Python 指向缺少的证书(如@dave_thompson_085 在评论中指出的那样)。

然而,这不太可能有任何好处,因为服务器显然会以 a 500: Internal Server Error(用 验证curl)和 a进行响应Content-Length: 0,这似乎表明其api.php自身处理中存在错误(即,无论如何都没有要处理的 JSON)。