Python 下载证书后请求抛出 SSLError
Python Requests throwing SSLError after downloading certificate
我正在使用请求包中的 requests.get() 命令,但收到以下错误,表明我认为我没有正确验证 SSL 连接。
requests.exceptions.SSLError:
HTTPSConnectionPool(host='marketplace.spp.org', port=443): Max retries
exceeded with url:
/file-browser-api/download/da-lmp-by-location?path=%2F2020%2F08%2FBy_Day%2FDA-LMP-SL-202008020100.csv
(Caused by SSLError(SSLError(336265225, '[SSL] PEM lib
(_ssl.c:3524)'),))
以下是我尝试使用 requests.get() 的方法。我分别尝试了它们,但它们都返回了相同的错误。
url = 'https://marketplace.spp.org/file-browser-api/download/da-lmp-by-location?path=%2F{}%2F{:02}%2FBy_Day%2FDA-LMP-SL-{}{:02}{:02}0100.csv'.format(year, month, year, month, day)
r = requests.get(url)
r = requests.get(url, cert='spp_cert.crt')
r = requests.get(url, verify='spp_cert.crt')
r = requests.get(url, verify='/etc/ssl/certs/ca-certificates.crt')
请注意,我已通过 运行 命令
检索到证书 'spp_cert.crt'
echo | openssl s_client -servername marketplace.spp.org -connect marketplace.spp.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > spp_cert.crt
我相信位置 /etc/ssl/certs/ca-certificates.crt 是我的 CA 包所在的位置,因为我 运行 来自 bash 的以下命令命令行来弄清楚。
python3 -m certifi
我想指出,我一直在使用 verify=False 作为参数,但是随着代码从一次性使用到生产,我不想再忽略这个警告.我承认我对 SSL 证书和验证的工作方式有点困惑,这可能是我问题的根源。
最后,我想指出,我能够通过 Firefox 下载相同的证书,但注意到它有两个下载证书的选项(PEM (cert) PEM (chain)),我有预感问题是我需要下载证书链而不是只下载一个证书。但我真的不知道这是如何工作的,如果这就是我需要做的,如果这是我需要做的,如何使用 openssl 来做到这一点。谢谢!
问题确实是我需要下载证书链,而不仅仅是单个证书。我不知道如何用 openssl 做到这一点,但我可以在 Firefox 中做到这一点。
这是通过转到网站,单击网址旁边的挂锁,单击消息“连接安全”旁边的箭头,单击“更多信息”,转到“安全”选项卡来完成的,单击“查看证书”,然后单击“杂项”部分中的下载“PEM(链)”。这是我使 requests.get() 正常工作所需的证书。
我正在使用请求包中的 requests.get() 命令,但收到以下错误,表明我认为我没有正确验证 SSL 连接。
requests.exceptions.SSLError: HTTPSConnectionPool(host='marketplace.spp.org', port=443): Max retries exceeded with url: /file-browser-api/download/da-lmp-by-location?path=%2F2020%2F08%2FBy_Day%2FDA-LMP-SL-202008020100.csv (Caused by SSLError(SSLError(336265225, '[SSL] PEM lib (_ssl.c:3524)'),))
以下是我尝试使用 requests.get() 的方法。我分别尝试了它们,但它们都返回了相同的错误。
url = 'https://marketplace.spp.org/file-browser-api/download/da-lmp-by-location?path=%2F{}%2F{:02}%2FBy_Day%2FDA-LMP-SL-{}{:02}{:02}0100.csv'.format(year, month, year, month, day)
r = requests.get(url)
r = requests.get(url, cert='spp_cert.crt')
r = requests.get(url, verify='spp_cert.crt')
r = requests.get(url, verify='/etc/ssl/certs/ca-certificates.crt')
请注意,我已通过 运行 命令
检索到证书 'spp_cert.crt'echo | openssl s_client -servername marketplace.spp.org -connect marketplace.spp.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > spp_cert.crt
我相信位置 /etc/ssl/certs/ca-certificates.crt 是我的 CA 包所在的位置,因为我 运行 来自 bash 的以下命令命令行来弄清楚。
python3 -m certifi
我想指出,我一直在使用 verify=False 作为参数,但是随着代码从一次性使用到生产,我不想再忽略这个警告.我承认我对 SSL 证书和验证的工作方式有点困惑,这可能是我问题的根源。
最后,我想指出,我能够通过 Firefox 下载相同的证书,但注意到它有两个下载证书的选项(PEM (cert) PEM (chain)),我有预感问题是我需要下载证书链而不是只下载一个证书。但我真的不知道这是如何工作的,如果这就是我需要做的,如果这是我需要做的,如何使用 openssl 来做到这一点。谢谢!
问题确实是我需要下载证书链,而不仅仅是单个证书。我不知道如何用 openssl 做到这一点,但我可以在 Firefox 中做到这一点。
这是通过转到网站,单击网址旁边的挂锁,单击消息“连接安全”旁边的箭头,单击“更多信息”,转到“安全”选项卡来完成的,单击“查看证书”,然后单击“杂项”部分中的下载“PEM(链)”。这是我使 requests.get() 正常工作所需的证书。