在Mac上的Python中,各种与SSL相关的操作(通常带有一个神秘的3.6+错误)将失败,直到您运行/Applications/Python\ 3.6/Install\ Certificates.command来安装根证书。在遇到这样的错误后,我在谷歌上搜索,最终发现了这个解决方案(比如https://bugs.python.org/issue29065#msg283984),它成功了。
但是现在我想调整我的代码,以捕捉我之前看到的错误,并显示一条有用的错误消息,向用户解释他们需要运行/Applications/Python\ 3.6/Install\ Certificates.command。但是,我不能很容易地测试这个错误处理代码,因为在运行了命令之后,我就不再获得我想要捕获的SSL错误。
如何卸载Install Certificates.command为执行此类测试而安装的证书?
发布于 2018-05-19 18:30:07
一个.command文件(通常)只是一个shell脚本,如果因为它的扩展名而在Finder中双击它,它就会得到特殊的处理。所以,如果你想知道一个人做什么,就读一读。在本例中,它实际上是Python脚本的一个简单包装器,这使得它更加容易(因为您可能比sh更了解Python )。
关键部分是:
openssl_dir, openssl_cafile = os.path.split(
ssl.get_default_verify_paths().openssl_cafile)
# ...
os.symlink(relpath_to_certifi_cafile, openssl_cafile)现在您已经知道它使用的是get_default_verify_paths,很明显这是相关的,以及如何检查相同的路径。默认路径是/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem,但这并不重要;ssl模块和安装工具都只是使用函数获取路径,您也可以这样做。
要卸载,只需删除证书:
os.remove(openssl_cafile)…或者,可能只是重命名它,这样您就可以在测试时在“已安装”和“卸载”状态之间来回切换。
同时,对于这种情况的测试并不像看起来那么简单,因为有四种可能性,而不仅仅是两种:
cert.pem。cert.pem链接到certifi包目录中的文件,因为用户正确地使用了此命令。cert.pem没有链接到该文件,但仍然是正确的,因为用户手动修复了它(或者用户在2021年运行您的程序,而且安装SSL的方式已经发生了变化)。cert.pem没有链接到该文件,也不正确,因为用户试图手动修复它,但出错了。对于用户设置的LBYL验证,我只需检查是否存在,以避免在第3种情况下窒息:
cafile = ssl.get_default_verify_paths().openssl_cafile
assert os.path.exists(cafile)另一方面,在获得SSL故障并希望EAFP-诊断设置以帮助用户之后,您可以这样做:
cafile = ssl.get_default_verify_paths().openssl_cafile
catarget = os.readlink(cafile)
cadir = os.path.basename(os.path.dirname(catarget))
assert cadir == 'certifi'(无论哪种方式,您显然都希望得到比这更好的错误处理。)
https://stackoverflow.com/questions/49900685
复制相似问题