pyOpenSSL 模块是否有任何不同的程序,或者我们需要在新机器上显式安装 openssl-devel 和 openss。
首先,我很确定 pyOpenSSL 只需要 openssl-devel 作为 build 依赖项,而不是运行时依赖项。因此,只要您分发预构建的副本(无论是通过压缩便携式 virtualenv、在自定义 repo 中使用 wheel 文件还是其他方式),openssl-devel 应该不是问题,只有openssl .
但是openssl 是一个问题。 pyOpenSSL 是一个纯 Python 包装器;它所做的只是dlopen .so 文件并从中调用一堆函数。没有.so,它根本无法做任何有用的事情。
我有点惊讶任何(非嵌入式)Linux 发行版都没有附带 OpenSSL。如果 CentOS 预装了openssl,那么你已经拥有了所有的依赖项,这里没有什么可做的。
但是,据我所知,OpenSSL 仍然不是 LSB 的一部分,这至少是一个可以想象的问题,所以让我们来处理它。
作为一个简短的侧边栏:如果您切换到用 C(或 SWIG 或 SIP)而不是 Python 编写的不同 OpenSSL 包装器(至少有三个主要替代方案),并直接链接 OpenSSL 而不是 cffi,那么一切会简单很多。例如,我相信使用 M2Crypto,您所要做的就是创建一个仅静态的 OpenSSL 构建,然后使用 --openssl=/path/to/static/openssl 构建 M2Crypto,就完成了。
但是如果你设置在pyOpenSSL,有什么办法可以解决这个问题吗?是的,但这并不容易。
好消息是 pyOpenSSL 不是 OpenSSL 本身的包装器,而是较低级别的 cryptography 模块。而cryptography 使用cffi 而不是ctypes,这意味着它可以与预构建的帮助模块一起分发,该模块可以与OpenSSL 静态链接。
不幸的是,虽然cryptography 确实内置了对在 Windows 上使用静态链接的 OpenSSL 预先构建其帮助程序的支持,但上次我检查时,它确实没有在其他平台上具有这种支持。这意味着您要么需要自己添加支持,要么以某种方式欺骗它。
如果您对这些东西知之甚少,那么您几乎可以肯定需要一步一步的帮助。阅读cffi 上的文档、Building cryptography on Linux 文档和捆绑的INSTALL 文件,确保您了解静态链接和 GNU ld,然后转到 cryptography-dev 邮件列表。或者也许去the bug tracker 并搜索或创建一个问题以在Linux 上静态链接OpenSSL。
但是,如果您知道自己在做什么,那么基本思路如下:
- 要构建静态链接支持,请查看 OpenSSL binding 和 binding utilities 源代码,了解它在 Windows 上的作用以及在 Linux 上的作用。
- 要解决这个问题,您要做的是在本地构建 OpenSSL,将其复制到
cryptography 源代码树中,使用相对路径而不是绝对路径将 cryptography 欺骗到 libopenssl.so(和朋友)的链接中,以及修改其setup.py 以将.so 文件复制到包本身中。
- 如果你想要真正的hacky,而不是修改
setup.py,只需在安装后手动将.so文件复制到包中。 (这显然只有在您使用基于捆绑 virtualenv 而不是重建它的分发机制时才有效。)
另一种选择是使用可执行打包程序自动将任何依赖的非系统库捆绑到可执行文件中。不幸的是,我知道的唯一一个在 linux 上做这种事情的人是pyInstaller,而last I checked 它不知道如何处理cryptography/pyOpenSSL,所以你必须再次弄清楚自己扩展pyInstaller。如果你想走这条路,看看那里的其他食谱。另外,我相信py2app 可以处理pyOpenSSL;虽然它是特定于 Mac 的,但看看它的作用可能会帮助您在 linux 上做同样的事情。