背景
最近的相关问题:如何告诉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
中的证书。
天真的问题
如何告诉requests
a(使用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
。如果你在存储中有正确的证书,它应该正确地验证你的端点。