很长一段时间我都在使用NVP作为一个简单记事本我的 Debian 系统上的客户端。最近,我的一个系统突然停止与网络服务同步。我考虑过 API 更改或类似的事情,但是当我尝试在其他系统上使用相同的应用程序(相同版本)时,一切都运行良好。
我在有问题的系统上调试了问题,发现系统SSL: CERTIFICATE_VERIFY_FAILED
在尝试与服务器通信时出现错误。我试图进一步了解,但失败了。目前我对这个问题的了解如下:
- 系统证书没问题。 Firefox 可以毫无问题地验证 SSL 证书。
- 我已经安装了
python-certifi
和python3-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
的代码库中。将打开错误报告,并从此时开始工作。