使用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/

10-13 03:23