gpt4 book ai didi

python - 撤消 "Install Certificates.command"

转载 作者:太空狗 更新时间:2023-10-29 20:50:53 25 4
gpt4 key购买 nike

在 Mac 上的 Python 3.6+ 中,各种与 SSL 相关的操作将失败(通常带有神秘的 SSL: CERTIFICATE_VERIFY_FAILED 错误),直到您运行 /Applications/Python\3.6/Install\Certificates .command 安装根证书。遇到这样的错误后,我用谷歌搜索,最终发现了这个解决方案(在例如 https://bugs.python.org/issue29065#msg283984 中注明),并成功了。

但现在我想调整我的代码以捕获我之前看到的错误并显示一条有用的错误消息,向用户解释他们需要运行 /Applications/Python\3.6/Install\Certificates。命令。不过,我无法轻松测试此错误处理代码,因为运行命令后,我不再收到想要捕获的 SSL 错误。

如何卸载通过 Install Certificates.command 安装的证书以执行此类测试?

最佳答案

.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)

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


与此同时,测试这种情况并不相当那么简单,因为有四种可能性,而不仅仅是两种:

  1. 没有 cert.pem
  2. cert.pem 链接到 certifi 包目录中的文件,因为用户正确使用了此命令。
  3. cert.pem 未链接到该文件,但仍然正确,因为用户手动修复了它(或者因为用户在 2021 年运行您的程序,并且 Python 安装 SSL 的方式发生了变化CA)。
  4. 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'

(无论哪种方式,您显然都想要比这更好的错误处理。)

关于python - 撤消 "Install Certificates.command",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49900685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com