0

我已将捆绑证书添加到 python 默认文件

>>> import ssl; print(ssl.get_default_verify_paths())
DefaultVerifyPaths(cafile='/usr/lib/ssl/cert.pem', capath='/usr/lib/ssl/certs', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/lib/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/lib/ssl/certs')

并且证书似乎运行良好

>>> import requests; requests.get('https://westeurope.experiments.azureml.net', verify='/usr/lib/ssl/cert.pem')
<Response [530]>

但是,当我尝试在没有明确指定证书文件的情况下执行相同的请求时,它会失败。

>>> requests.get('https://westeurope.experiments.azureml.net')
# ...
requests.exceptions.SSLError: HTTPSConnectionPool(host='westeurope.experiments.azureml.net', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1051)')))

据我了解,这不应该发生,对吧?为什么 Python 没有加载我在默认路径中提供的证书?

我正在使用 Python 3.7.1

谢谢

4

1 回答 1

2

requests不使用来自的默认值ssl;它使用 envvarREQUESTS_CA_BUNDLECURL_CA_BUNDLE如果设置,则使用(spunoff)certifi模块,这取决于您如何安装您没有说的请求和证书以及您未标识的环境可能使用系统默认值(可能相同也可能不同)作为ssl) 中使用的 OpenSSL,或者可能是它自己的 Mozilla 副本。在后一种情况下,它应该包括该站点所需的 Digicert Global Root CA,因为 Firefox(也是 Mozilla)会这样做。

requests.certs.where()python -m requests.certs

主要是欺骗
Python 请求 - 如何使用系统 ca 证书(debian/ubuntu)?
如何强制请求使用我的 ubuntu 系统上的证书
为什么 python 请求默认不使用系统 ssl 证书?

于 2021-06-19T12:04:35.990 回答