如何在Python3中更改ssl模块中的“cafile”参数?

如何在Python3中更改ssl模块中的“cafile”参数?,python,macos,python-requests,Python,Macos,Python Requests,我正在将我的Python2代码移植到Python3。这一节专门讨论在Python3中运行我的代码时,我在本地机器上发布到一个网页的情况。在Python2中,一切都很好。我相信我的问题的根本原因是我这边的证书没有通过服务器的身份验证。下面是我看到的错误 Error(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1

我正在将我的Python2代码移植到Python3。这一节专门讨论在Python3中运行我的代码时,我在本地机器上发布到一个网页的情况。在Python2中,一切都很好。我相信我的问题的根本原因是我这边的证书没有通过服务器的身份验证。下面是我看到的错误

Error(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1056)')))
request Error: HTTPSConnectionPool(host='my/personal.server', port=443): Max retries exceeded with url: my/personal/url/and/data (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1056)')))
该错误发生在程序中的my requests.postrl标题行上。我已确保服务器URL是正确的

我认为问题如下。在macOS的原生Python2环境(我以前编写过代码)中,ssl模块与Python3用于导入的目录中的模块不同。我的问题是:

我的Python3实例可以使用LibreSSL吗? 如果没有,在Python3中导入ssl模块时,如何传递cafile和其他路径参数? FWIW,我从Python.org下载了python3

Python 2 Python 3 我相信这就是为什么我会有这个错误的原因,尽管我不是100%确定。欢迎任何其他指针或输入

编辑 根据ivan_pozdeev建议的重复问题,我能够运行openssl s_客户端-connect mywebsite.com:443-verify 9,并得到verify返回代码:0 ok。虽然我没有在python/bash脚本中直接调用openssl,但我已经能够验证我的Python2配置是否有效

⇒  openssl
OpenSSL> version
LibreSSL 2.6.5
OpenSSL> ca
Using configuration from /private/etc/ssl/openssl.cnf
我正在研究如何利用我在Python3解释器及其库中所做的工作。然而,这似乎更像是一个测试,看看我是否可以与服务器对话,而不是解决参数/环境问题

编辑2 也许这是一个调查时间过长的案例,但我发现了一些奇怪的事情。上面的Python 2/3实例是在zsh中完成的,而不是在我的程序中完成的。当我使用这些打印语句运行脚本时,我得到以下ssl信息:

Python 2 导入ssl 打印ssl.OPENSSL\u版本 打印ssl.get\u默认\u验证\u路径 输出

Python 3 导入ssl printssl.OPENSSL\u版本 printssl.get\u默认\u验证\u路径 输出


Python2脚本输出了我所期望的内容。Python 3脚本将我的cafile参数设置为None,这与在zsh中运行ssl.get\u default\u verify\u path时返回的路径不同。我在bash脚本中使用python和python3别名来调用我的python脚本,并且绝对确定它们引用的解释器与我的zsh相同。这里到底发生了什么?

发现可以通过围绕python脚本编写的bash shell脚本在环境中设置参数

export SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem
export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/cert.pem

我猜我的脚本以前只是查看一个空的证书目录?不管怎样,它现在起作用了。我写的路径是OpenSSL默认拥有证书的位置。

使用的是哪种证书?它们安装在何处?证书验证失败意味着问题在于请求查找必要的根证书以验证服务器的根证书。可能是Ah ok的重复。是否可以将Python3实例指向与Python2实例相同的证书文件夹?我希望Python3的cafile变量指向/private/etc/ssl/cert.pem,但我不确定如何执行该操作。我将研究您链接的可能重复项,谢谢。
⇒  openssl
OpenSSL> version
LibreSSL 2.6.5
OpenSSL> ca
Using configuration from /private/etc/ssl/openssl.cnf
LibreSSL 2.2.7
DefaultVerifyPaths(cafile='/usr/local/etc/openssl/cert.pem', capath='/private/etc/ssl/certs', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/private/etc/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/private/etc/ssl/certs')
OpenSSL 1.1.0j  20 Nov 2018
DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/Library/Frameworks/Python.framework/Versions/3.7/etc/openssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/Library/Frameworks/Python.framework/Versions/3.7/etc/openssl/certs')
export SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem
export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/cert.pem