【发布时间】:2018-05-12 23:47:19
【问题描述】:
我想要做什么以及为什么需要一段时间来解释的完整解释。基本上,我想在公共分布式应用程序中使用私有 SSL 连接,而不是分发我的私有 ssl 密钥,因为这否定了目的! IE。我想要没有人能看到的安全远程数据库操作——包括客户端。
我的核心问题是:如何让 Python ssl 模块使用内存中包含 ssl pem 文件内容的数据而不是硬文件系统路径?
类 SSLSocket 的构造函数调用 load_verify_locations(ca_certs) 和 load_cert_chain(certfile, keyfile),因为它们是 .pyd 文件,所以我无法追踪它们。在那些黑匣子中,我假设这些文件被读入内存。我怎样才能使过程短路并直接传递数据? (也许换掉 .pyd?...)
我的其他想法是:我可以使用io.StringIO 创建一个虚拟文件,然后传递文件描述符。我已经将该概念与将采用描述符而不是路径的类一起使用。不幸的是,这些类不是这样设计的。
或者,也许使用虚拟文件系统/内存驱动器?不过这可能会很麻烦,因为我需要它是跨平台的。另外,如果有人可以从任何外部程序访问这些路径,那可能会否定我正在尝试做的事情......
我想我可以将它们作为真实文件保存,但将它们“隐藏”在文件系统中的某个位置。
我不可能是第一个遇到这个问题的人。
更新
我找到了“黑匣子”的来源...
https://github.com/python/cpython/blob/master/Modules/_ssl.c
它们按预期工作。他们只是从路径中读取文件内容,但你必须深入到 C 层才能做到这一点。
我可以用 C 编写代码,但我从未尝试过重新编译底层 Python 源代码。看起来也许我应该按照https://devguide.python.org/ 此处的指示来提取 Python 存储库并进行更改。我想我可以将我的更新提交给 Python 社区,看看他们是否想像我描述的那样制作一个新的标准化功能......看起来还有很多工作......
【问题讨论】:
-
有了该主题的一些背景知识,我可以告诉您,所有这些都不会使私钥变得安全。差远了。为了保护私钥不被访问,您需要一个具有安全存储的硬件加密设备。
-
谢谢。记下。不幸的是,这超出了我想要销售的范围,我不确定这如何阻止客户访问密钥?需要物理设备会给商业模式带来根本性的差异,所以这不是首发。我想要一个可下载的、预先打包的程序,它可以以“没有人”可以看到的方式与远程数据库交互。这种方法存在潜在的安全漏洞,但与仅向每个鞠躬的用户分发相同的私钥相比,它似乎至少是朝着正确方向迈出的一步。
标签: python ssl virtualfilesystem virtual-file