使用Anaconda3测试一段简单的代码:
import requests as req
resp = req.get("https://api.github.com")
print(resp.text)
我得到这个错误:
SSLError: HTTPSConnectionPool(host='api.github.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')])")))
使用调试器跟踪调用,问题似乎出现在request.utils中的
get_netrc_auth()
中。在这里,此代码用于获取netrc文件的完整路径: for f in NETRC_FILES:
try:
loc = os.path.expanduser('~/{}'.format(f))
但是,这仅提供了我的主目录的路径,而netrc在工作环境的
Lib
目录中。显然,我在某个地方设置了错误的环境变量。有什么建议吗?
编辑问题:
根据Steffen的回答,netrc似乎不是问题所在。 Marsiliou的建议是直接包含cert文件的路径(即
resp = req.get("https://api.github.com" verify='/path/to/certfile')
)确实工作了……昨天一次。我的代码现在看起来像这样:
import requests as req
from os import environ
cert_path = environ['CONDA_PREFIX'] + '\Lib\site-packages\certifi\cacert.pem'
print (cert_path)
resp = req.get("https://api.github.com", verify= cert_path)
print(resp.text)
cert_path
扩展为C:\ProgramData\Anaconda3\Lib\site-packages\certifi\cacert.pem
这将导致相同的SSLError。有什么建议(除了将
verify
设置为False
以外)?PS-并回答史蒂芬的其他问题-这是Windows 10上的Anaconda3,Python 3.7.3。
最佳答案
我认为您的问题已经在这里回答了,您尝试过吗?
SSL HTTS requests.exceptions.SSLError: HTTPSConnectionPool(host='google.com', port=443)
关于python - 对SSL站点的request()的Python调用未指向netrc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58921899/