Python3.11下使用源码包安装有cryptography3.3.2和paramiko3.1.0(也尝试过降版本到paramiko 2.7.1和cryptography2.9.2的组合)
在import paramiko时报错,报错信息如下:
>>> import paramiko
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/pythonuser/src/paramiko-2.7.1/paramiko/__init__.py", line 22, in <module>
from paramiko.transport import SecurityOptions, Transport
File "/home/pythonuser/src/paramiko-2.7.1/paramiko/transport.py", line 129, in <module>
class Transport(threading.Thread, ClosingContextManager):
File "/home/pythonuser/src/paramiko-2.7.1/paramiko/transport.py", line 190, in Transport
if KexCurve25519.is_available():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pythonuser/src/paramiko-2.7.1/paramiko/kex_curve25519.py", line 30, in is_available
X25519PrivateKey.generate()
File "/home/pythonuser/venv02/lib/python3.11/site-packages/cryptography-2.9.2-py3.11-linux-x86_64.egg/cryptography/hazmat/primitives/asymmetric/x25519.py", line 38, in generate
from cryptography.hazmat.backends.openssl.backend import backend
File "/home/pythonuser/venv02/lib/python3.11/site-packages/cryptography-2.9.2-py3.11-linux-x86_64.egg/cryptography/hazmat/backends/openssl/__init__.py", line 7, in <module>
from cryptography.hazmat.backends.openssl.backend import backend
File "/home/pythonuser/venv02/lib/python3.11/site-packages/cryptography-2.9.2-py3.11-linux-x86_64.egg/cryptography/hazmat/backends/openssl/backend.py", line 75, in <module>
from cryptography.hazmat.bindings.openssl import binding
File "/home/pythonuser/venv02/lib/python3.11/site-packages/cryptography-2.9.2-py3.11-linux-x86_64.egg/cryptography/hazmat/bindings/openssl/binding.py", line 16, in <module>
from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: /home/pythonuser/venv02/lib/python3.11/site-packages/cryptography-2.9.2-py3.11-linux-x86_64.egg/cryptography/hazmat/bindings/_openssl.abi3.so: undefined symbol: OPENSSL_sk_num
但如果改用whl安装cryptography的话,import paramiko就正常。
操作系统:CentOS7,独立目录安装有OpenSSL版本1.1.1t,
OpenSSL安装环境配置为:
../config --prefix=/usr/local/openssl shared zlib threads enable-camellia
安装后已为相关的bin、include、lib64里的libssl.so.1.1和libcrypto.so.1.1建立了软链接
也更新了动态链接库
/usr/local/openssl/lib:
libssl.so.1.1 -> libssl.so.1.1
libcrypto.so.1.1 -> libcrypto.so.1.1
Python全程在激活虚拟环境下操作,也试过不使用虚拟环境,问题一样。
此外,试过使用系统自带的openssl-1.0.2k和独立安装的openssl-0.9.8e来重新编译Python,结果都一样。
请教老师们,这个可能是什么原因造成的,如何解决?非常感谢!
做一波排查吧
你说的这个问题,应该是由于该库版本升级过程导致的问题,OPENSSL_sk_num已移动到libcrypto.a。但是 python 3的构建似乎没有将其链接起来,因此报错缺少了符号。
来自chaptgpt的答案:
这个问题可能是因为安装 cryptography 和 paramiko 的依赖库版本不兼容导致的,piramiko 2.7.1 依赖 cryptography >= 1.5 ,而当前系统中安装的 cryptography 版本为 3.3.2,版本过高导致无法被 piramiko 正常调用。
一个解决这种问题的方法是使用虚拟环境,在虚拟环境中安装正确版本的 cryptography 和 piramiko。通过查看输出信息可以看出两个包在虚拟环境中应该都已经安装了,推测你没有激活虚拟环境。
需要先根据自己实际情况指定虚拟环境的解释器目录,以 venv02/bin/python 为例:
source /path/to/venv02/bin/activate
然后再尝试执行 import paramiko 等操作。如果还有问题,可以使用 pip 卸载和重新安装 cryptography 和 paramiko 来试试
有类似的问题,并通过设置环境并重新安装来解决。查看http://github.com/jtriley/StarCluster/issues/138