从源代码构建Python和OpenSSL,但ssl模块失败

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

我正在尝试在容器中从源代码构建 Python 和 OpenSSL。 两者似乎都正确构建,但 Python 未成功创建

_ssl
模块。

我在网上找到了一个 few guides,其中提到要取消来自 Python-

3.X.X/Modules/Setup
的注释和行,并将
--openssldir=/usr/local/ssl
标志添加到 OpenSSL 的
./configure
步骤中。 我在我的 dockerfile 中执行这些操作。 这样的效果是,在 Python 的
./configure
输出期间,我看到以下行。

checking for X509_VERIFY_PARAM_set1_host in libssl... yes

但是我收到以下错误:

[91m*** WARNING: renaming "_ssl" since importing it failed: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by build/lib.linux-x86_64-3.8/_ssl.cpython-38-x86_64-linux-gnu.so)
[0m[91m*** WARNING: renaming "_hashlib" since importing it failed: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: version `OPENSSL_1_1_1' not found (required by build/lib.linux-x86_64-3.8/_hashlib.cpython-38-x86_64-linux-gnu.so)
[0m
Python build finished successfully!

...

Following modules built successfully but were removed because they could not be imported:
_hashlib              _ssl                                     


Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

如果

./configure
找到
X509...
,为什么我仍然收到 hashlib 和 ssl 错误?

完整的 Dockerfile,FWIW:

FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y apt-utils gcc make zlib1g-dev \
    build-essential libffi-dev checkinstall libsqlite3-dev 
RUN wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz && \
    tar xzf openssl-1.1.1d.tar.gz && \
    cd openssl-1.1.1d && \
    ./config -Wl,--enable-new-dtags,-rpath,'$(LIBRPATH)' --prefix=/usr/local/ssl --openssldir=/usr/local/ssl && \
    make && \
    make test && \
    make install
RUN wget -q https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz && \
    tar -xzf Python-3.8.2.tgz && \
    cd Python-3.8.2 && \
    ./configure && \
    make && \
    make install
USER jenkins
python linux docker ssl openssl
5个回答
15
投票

以下内容在 Amazon EC2 上为我工作,默认为 CentOS 7 系统。

首先,CentOS 7 上的 openssl 库太旧了(Python 3.9+ 需要 openssl 1.1.1+,可用版本是 1.0.x)。安装较新的:

sudo yum install openssl11-devel

注意:自从写完这个答案后,亚马逊已经终止了 openssl11-devel 软件包并将 openssl-devel 更新到 3.0.8。 3.0.8 对于 Python 来说已经足够了,所以现在你可以做

yum install openssl-devel

不幸的是,CentOS 实际上并没有将 SSL 库放在 Python 可以找到的任何地方。经过一些尝试和错误,我发现这让

./configure
很高兴:

export OPENSSL_LIBS=/usr/lib64/libssl.so
./configure \
  --with-openssl=/usr \
  --with-openssl-rpath=/usr/lib64 \
  --enable-optimizations

说明:

  • Python 默认情况下不会在 lib64 中查找,而 lib64 正是 openssl11 的安装位置。
  • --with-openssl
    采用 ./configure 附加
    include/openssl/ssl.h
    的路径,因此请确保您的系统存在该路径!

当您运行

./configure
时,您正在寻找输出末尾附近的一行,例如:

checking for stdlib extension module _ssl... yes

如果您看到

missing
而不是
yes
,请在 config.log 中搜索 openssl,这应该会为您提供一些有关问题所在的指导。

希望这可以节省其他人的很多时间我花了很多时间来解决这个问题。


7
投票
Following modules built successfully but were removed because they could not be imported:
_hashlib              _ssl                                     

Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

从源代码构建 openssl 时似乎存在安装问题。对于

_ssl
模块上的构建失败,请在使用脚本
--with-openssl
配置 Python 时尝试额外的选项,例如
CFLAGS
LDFLAGS
./configure
,例如

./configure  --with-openssl=/PATH/TO/YOUR/OPENSSL_INSTALL_FOLDER/ \
    --enable-optimizations \
    --with-ssl-default-suites=openssl \
    CFLAGS="-I/PATH/TO/YOUR/OPENSSL_INSTALL_FODLER/include" \
    LDFLAGS="-L/PATH/TO/YOUR/OPENSSL_INSTALL_FODLER/"

也可以尝试这个命令

openssl version
,如果它报告这样的错误:

/usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found

这意味着您的openssl库存在链接问题,我不确定您是否在Linux或其他系统上,但是对于Linux系统,您可以手动修改openssl库的链接来修复问题,如我的描述中在这里回答.

参考

构建 Python 3.7.1 - SSL 模块失败

Python 3.7.0 无法使用 SSL 支持 1.1.0 进行编译


7
投票

我遇到了同样的问题,经过 3 个多小时的搜索,这才是真正有效的:

Error: "ssl module is not available" when installing package with pip3
———————————————————-
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘SSLError(“Can’t connect to HTTPS URL because the SSL module is not available.”)’: /simple/pip/

The fix:
———————————————————-
sudo yum install openssl11 openssl11-devel
mkdir /usr/local/openssl11
cd /usr/local/openssl11
ln -s /usr/lib64/openssl11 lib
ln -s /usr/include/openssl11 include

上面的代码为最新的

openssl11
创建了一个备用路径,并将其符号链接到与 python 期望的文件夹结构相匹配的位置。

然后继续执行指南中的原始步骤 (https://linuxstans.com/how-to-install-python-centos/

并在你的Python安装文件夹中像这样配置:

./configure -–enable-optimizations -–with-openssl=/usr/local/openssl11
make altinstall

altinstall
很重要,这样你就不会覆盖系统默认的python。此后,您必须从命令行将其调用为
python3.10

我在 CentOS 7 和 Python-3.10.8 上对此进行了测试。

参考: https://linuxstans.com/how-to-install-python-centos/?unapproved=4338&moderation-hash=9903c8ebd6634e5bbbad96716e283f8b#comment-4338


1
投票

我认为 Jenkins Image 附带安装了一些不是 1.1.1 的 openssl 版本,因此你在 libssl 中找到 X509...但无法构建。

关于上述配置选项,您可以使用 bash 作为 CMD 启动容器,将配置从容器内复制到映像所在的计算机,编辑 ist 并将您的配置版本烘焙到映像中。


0
投票

我也有同样的错误。 我将 OpenSSL 安装在 /usr/local 中。 运行配置为

./configure --with-openssl=/usr/local  --with-openssl-rpath=/usr/local/lib64  --enable-optimizations

输出为:

checking for include/openssl/ssl.h in /usr/local... yes
checking for --with-openssl-rpath... /usr/local/lib64
checking whether OpenSSL provides required ssl module APIs... yes
checking for --with-ssl-default-suites... python
checking for stdlib extension module _ssl... yes

但是 make 返回错误:

[错误] _ssl 导入失败:/linx/src/Python-3.13.0/build/lib.linux-x86_64-3.13/_ssl.cpython-313-x86_64-linux-gnu.so:未定义符号:SSL_SESSION_get_time_ex 以下模块已成功构建,但因无法导入而被删除:_ssl

/usr/local/lib64 中的那些 lib 文件是:

drwxr-xr-x 3 root root     4096 Jan  1 18:09 cmake  
drwxr-xr-x 2 root root     4096 Jan  1 21:46 engines-3
-rw-r--r-- 1 root root 10746638 Jan  1 21:46 libcrypto.a
lrwxrwxrwx 1 root root       14 Jan  1 21:46 libcrypto.so -> libcrypto.so.3
-rwxr-xr-x 1 root root  6278488 Jan  1 21:46 libcrypto.so.3
-rw-r--r-- 1 root root  1999166 Jan  1 21:46 libssl.a
lrwxrwxrwx 1 root root       11 Jan  1 21:46 libssl.so -> libssl.so.3
-rwxr-xr-x 1 root root  1221320 Jan  1 21:46 libssl.so.3
drwxr-xr-x 2 root root     4096 Jan  1 21:46 ossl-modules
drwxr-xr-x 2 root root     4096 Jan  1 18:09 pkgconfig

.bashrc:

export PATH=~/bin:/snap/bin:/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
export OPENSSL_LIBS=/usr/local/lib64/libssl.so

操作系统是 debian 10

© www.soinside.com 2019 - 2024. All rights reserved.