首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >撤消“安装Certificates.command”

撤消“安装Certificates.command”
EN

Stack Overflow用户
提问于 2018-04-18 13:14:30
回答 1查看 6.5K关注 0票数 9

在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为执行此类测试而安装的证书?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-19 18:30:07

一个.command文件(通常)只是一个shell脚本,如果因为它的扩展名而在Finder中双击它,它就会得到特殊的处理。所以,如果你想知道一个人做什么,就读一读。在本例中,它实际上是Python脚本的一个简单包装器,这使得它更加容易(因为您可能比sh更了解Python )。

关键部分是:

代码语言:javascript
复制
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模块和安装工具都只是使用函数获取路径,您也可以这样做。

要卸载,只需删除证书:

代码语言:javascript
复制
os.remove(openssl_cafile)

…或者,可能只是重命名它,这样您就可以在测试时在“已安装”和“卸载”状态之间来回切换。

同时,对于这种情况的测试并不像看起来那么简单,因为有四种可能性,而不仅仅是两种:

  1. 没有cert.pem
  2. cert.pem链接到certifi包目录中的文件,因为用户正确地使用了此命令。
  3. cert.pem没有链接到该文件,但仍然是正确的,因为用户手动修复了它(或者用户在2021年运行您的程序,而且安装SSL的方式已经发生了变化)。
  4. cert.pem没有链接到该文件,也不正确,因为用户试图手动修复它,但出错了。

对于用户设置的LBYL验证,我只需检查是否存在,以避免在第3种情况下窒息:

代码语言:javascript
复制
cafile = ssl.get_default_verify_paths().openssl_cafile
assert os.path.exists(cafile)

另一方面,在获得SSL故障并希望EAFP-诊断设置以帮助用户之后,您可以这样做:

代码语言:javascript
复制
cafile = ssl.get_default_verify_paths().openssl_cafile
catarget = os.readlink(cafile)
cadir = os.path.basename(os.path.dirname(catarget))
assert cadir == 'certifi'

(无论哪种方式,您显然都希望得到比这更好的错误处理。)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49900685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档