我正在开发一个使用密码学和 PyOpenSSL 的 Python 项目。我基于Python 3.10为项目的所有依赖项创建了一个虚拟环境。由于我需要比这些库提供的更多 OpenSSL 功能,因此我修改了这些库,然后使用
pip install -e .
(在 venv 中)构建它们。
然后我运行了我的项目,它运行得很好,包括我添加到库中的新功能。
现在,我想在不同的设备上运行相同的项目,因此我将我的项目以及加密库和 PyOpenSSL 库推送到三个单独的 GitLab Repo 并从我的笔记本电脑克隆它们。我将 venv 文件夹包含在 Git 项目中,因为我认为这样可以更轻松地在我的第二台设备上运行。
我克隆了三个项目并运行了我的项目,但是,我遇到了以下错误:
导入错误:/home/xy/Projects/cryptography/src/cryptography/hazmat/bindings/_rust.abi3.so:未定义符号:EVP_PKEY_get_id
我尝试再次安装这两个库(从克隆的 Git 项目),但错误仍然存在。 我用
openssl version
检查了 OpenSSL 是否已正确安装,看起来确实如此。
我认为 venv 有一些问题,所以我在没有 venv 的情况下尝试了相同的操作:
安装了库,然后运行了项目,但问题仍然存在。
我认为这不是我的代码的问题,因为它在我的桌面上运行良好, 而是 pip 安装库的问题。 这两款设备都运行 KDE Neon、Python 3.10.12 和 OpenSSL 3.0.2。 有人解决这个问题吗?通过 Git 共享 venv 有意义还是我应该创建一个新的 venv?难道是我安装的时候出错了?
编辑:我尝试使用
virtualenv
代替venv
,就像建议的here一样,但它仍然不起作用。
另外,我认为 OpenSSL 3.0 中添加了 EVP_PKEY_get_id。所以我假设问题是我针对 OpenSSL 3.0 编译密码学,但随后将其链接到 OpenSSL 1.x(如here所述)。
但我不知道如何解决这个问题。我注意到/usr/lib/x86-64-linux-gnu
中有以下文件
libcrypt.so libcrypt.so.1 libcrypt.so.1.1.0
和
libssl.so libssl.so.1.1 libssl.so.3
我想知道这些 1.1 版本是否以某种方式使用并导致了问题?我不知道如何检查,但我犹豫是否要删除它们。
我找到了一个适合我的解决方案: Docs 提供了构建静态轮的脚本。 在我的 venv 中,我运行了
pip uninstall cryptography
,然后创建了一个空的 .sh
文件,将下面的脚本粘贴到其中并运行它。这创建了一个 .whl
文件,然后我用 pip install <.whl_file>
安装了该文件
脚本(针对我的本地加密版本和 OpenSSL 3.0.2 稍作修改:
set -e
OPENSSL_VERSION="3.0.2"
CWD=$(pwd)
virtualenv env
. env/bin/activate
pip install -U setuptools
pip install -U wheel pip
curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
tar xvf openssl-${OPENSSL_VERSION}.tar.gz
cd openssl-${OPENSSL_VERSION}
./config no-shared no-ssl2 no-ssl3 -fPIC --prefix=${CWD}/openssl
make && make install
cd ..
OPENSSL_DIR="${CWD}/openssl" pip wheel --no-cache-dir --no-binary cryptography ./