在 Python 应用程序中获取证书验证失败错误

在 Python 应用程序中获取证书验证失败错误

很长一段时间我都在使用NVP作为一个简单记事本我的 Debian 系统上的客户端。最近,我的一个系统突然停止与网络服务同步。我考虑过 API 更改或类似的事情,但是当我尝试在其他系统上使用相同的应用程序(相同版本)时,一切都运行良好。

我在有问题的系统上调试了问题,发现系统SSL: CERTIFICATE_VERIFY_FAILED在尝试与服务器通信时出现错误。我试图进一步了解,但失败了。目前我对这个问题的了解如下:

  • 系统证书没问题。 Firefox 可以毫无问题地验证 SSL 证书。
  • 我已经安装了python-certifipython3-certifi软件包,因此 python 可以看到证书。
  • 应用程序在其他两个 Debian 系统上运行良好。所有这些都在运行 Debian 测试并且始终保持最新状态。
  • 该软件的独立安装也会出现相同的错误,因此应用程序没有损坏,也没有在其安装目录下存储某些内容。

我缺少一些关于 python 或一些缓存的东西,但我找不到任何合理的东西。

更新1:

以下是我对三个系统和 Web 应用程序的审核所要求的信息和结果:

  • 该应用程序驻留在https://simple-note.appspot.com/。 REST 端点示例是https://simple-note.appspot.com/api/login。整个域名由 Google 的 CA 机构 G2 签名,证书有效期至 2017 年 12 月 6 日。它是一个 2048 位 PKCS #1 SHA-256 w/ RSA。
  • 当我检查我的三个系统时,其中一个系统与有问题的系统完全相同(/etc/ssl/certs用 进行检查md5deep)。一个系统有额外的证书,但正常运行的系统之一缺少这些证书,所以这不是问题。
  • 所有系统都已python-certifi安装软件包。

结果:所有三个系统都有相同的证书,其中一个系统有额外的证书。额外的证书并不重要,因为没有额外证书的系统可以正常nvPY安装。

 更新2:

看来Pythonurllib2本身无法找到证书。当我capath使用 提供的自定义上下文时certifi.where(),事情会恢复正常。奇怪的是,其他系统不需要这个自定义上下文。接下来我将尝试找出工作系统和非工作系统之间的差异。

更新3:

我编写了一个小工具,可以连接到任意 URL 并测试连接性,urllib2奇怪的是,该工具工作正常。更奇怪的是,将有问题的代码移植到我的工具中不会产生任何问题(它按预期工作)。问题出在nvPY的代码库中。将打开错误报告,并从此时开始工作。

相关内容