请求SSL验证-通过Pyinstaller创建exe时仅使用windows证书存储



背景

最近的相关问题:如何告诉pyinstaller使用带有--onefile选项的python-certificate-win32

我正在为客户端创建一个应用程序,该应用程序使用requests向外连接到几个AWS托管的应用程序。我的客户端使用Windows 10,所以我使用pyinstaller创建单个文件exe作为分发/部署模型。

用例和问题

  • 客户端通常位于公司防火墙后面,因此使用自定义SSL证书
  • 如果SSL证书在certifi中更新,我不想强迫我的用户频繁更新我的应用程序
  • 我不想在我的应用程序中使用(或负责(与客户端在操作系统级别证书存储中可能使用的(和/或其IT部门指定的(不同的单独CA存储

->因此,基本上我希望请求只使用操作系统(在这种情况下,特别是Windows(的证书存储,而不提供/分发任何单独的证书(即通过证书(。


观察

这似乎是一个常见的用例,也是人们遇到的一个常见问题,但其中一个没有任何简单的解决方案(或者至少是作为requests文档和/或urllib3的一部分提到/讨论/记录的任何内容(。

"嘿,我们将使用独立于操作系统的证书存储"的请求概念有一些优点和缺点。。。在这个用例中,它并不太适合。


Naive(?(解决方案

我绝不是网络或requests专家,所以在尽可能多地研究之后,最好的办法似乎是告诉requests从Windows证书存储中获取用于SSL验证的所有证书,而不是使用certifi中的证书。

天真的问题

如何告诉requestsa(使用Windows证书存储获取证书,b(使用那里的证书(因此不使用certifi提供的任何证书(。

  • 这个蟒蛇证书似乎有一个模块-win32,但它似乎很旧,可能没有维护。。。然而,这是我应该使用的吗?

  • python-certificate-win32中的文档以及我通过搜索可以找到的内容表明,这只是将窗口存储证书添加到任何已经从certifi获得的证书中,而不是替换。。。对吗。。。如果正确的话,你将如何使用python-certificate-win32中的

python-certifi-win32在PyInstaller的运行时设置中执行时失去了一些自动魔力。这就是我所做的让它工作:

if sys.platform == 'win32':
import certifi_win32
os.environ['REQUESTS_CA_BUNDLE'] = certifi_win32.wincerts.where()
certifi_win32.generate_pem()

设置REQUESTS_CA_BUNDLE将指向使用certificate_win32创建的存储的请求。CCD_ 13函数将联合PyInstaller(位于<MEIPASS>certifi中(附带的证书捆绑包和wincert存储。生成的pem文件被写入%LOCALAPPDATA%/.certifi/cacert.pem。如果你在存储中有正确的证书,它应该正确地验证你的端点。

最新更新