导入错误:./cryptography/src/cryptography/hazmat/bindings/_rust.abi3.so:未定义符号:使用密码学时的 EVP_PKEY_get_id

问题描述 投票:0回答:1

我正在开发一个使用密码学和 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 版本是否以某种方式使用并导致了问题?我不知道如何检查,但我犹豫是否要删除它们。

python pip cryptography pycrypto pyopenssl
1个回答
0
投票

我找到了一个适合我的解决方案: 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 ./
© www.soinside.com 2019 - 2024. All rights reserved.