构建Python 3.7.1 - SSL模块失败

mca*_*tis 11 python ssl openssl python-3.x

从源代码构建Python 3.7会遇到以下错误:

Failed to build these modules:
_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
Run Code Online (Sandbox Code Playgroud)

我从其他stackoverflow问题尝试了很多变通方法,但它不起作用.我从源代码构建最新的OpenSSL和LibreSSL.OpenSSL路径是:"/ usr/local/ssl",版本为OpenSSL 1.0.2p.

./configure --with-openssl=/usr/local/ssl/
(./configure CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib")
make 
make altinstall
Run Code Online (Sandbox Code Playgroud)

我的系统:Ubuntu 12.04.5 LTS

有任何想法吗?

Sun*_*mar 13

仅仅因为这个博客,我在 3 天后解决了它使用 python 3.7.4 openssl 1.1.0 centOS 6。

这是摘要:

首先,一些先决条件:

sudo apt-get install build-essential checkinstall libreadline-gplv2-dev libncursesw5-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
Run Code Online (Sandbox Code Playgroud)

如果使用 centos linux,请使用 yum 而不是 apt-get。

安装 ssl 1.0.2 或更高版本。

    cd /usr/src
    curl https://www.openssl.org/source/openssl-1.0.2o.tar.gz | tar xz
    cd openssl-1.0.2o
    ./config shared --prefix=/usr/local/
    sudo make
    sudo make install
Run Code Online (Sandbox Code Playgroud)

我们需要将 /usr/src/openssl-1.0.2o 传递到 Python 配置脚本中。

mkdir lib
cp ./*.{so,so.1.0.0,a,pc} ./lib
Run Code Online (Sandbox Code Playgroud)

现在继续安装 Python:

    cd /usr/src
    sudo wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
    sudo tar xzf Python-3.7.0.tgz
    cd Python-3.7.0
    ./configure --with-openssl=/usr/src/openssl-1.0.2o --enable-optimizations
    sudo make
    sudo make altinstall
Run Code Online (Sandbox Code Playgroud)

要测试它,请运行 python3.7 并输入:

import ssl
ssl.OPENSSL_VERSION
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 使用 rpath 将库路径烘焙到可执行文件中,这样就不需要每次需要 Python 可执行文件时都设置库路径;例如,pip、virtualenv 等。这是一个示例: `LDFLAGS="${LDFLAGS} -Wl,-rpath=/usr/local/ssl/lib" CFLAGS="${CFLAGS} -I/usr/local/ ssl/include" ./configure --prefix=/home/lawlist/opt/python_3_9_13 --with-openssl=/usr/local/ssl` 成功构建 Python 并避免构建时出现 `_hashlib` 失败的关键要素同样,在构建 `openssl` 时使用 `shared` 标志,在构建 Python 时使用 `--with-openssl` 标志。 (3认同)
  • 从源代码获取 openssl 非常有用。我必须进行一项更改,在运行配置命令之前设置导出 LD_LIBRARY_PATH=/usr/src/openssl-1.0.2o/lib 。这是带有 Python 3.8.2 的 Ubuntu 14。工作了,耶! (2认同)
  • 仅在将 LD_LIBRARY 导出为上面提到的 @blissweb 后才有效!使用 Debian 8 (2认同)

nor*_*ori 9

编译openssl

下载您的 openssl tarball,解压缩,然后确保安装目录名为openssl.

我把我的放在 /usr/local/openssl 中,所以我会在我的例子中使用它。

  1. sudo mv openssl-1.0.2u /usr/local/openssl && cd /usr/local/openssl

  2. sudo make distclean

  3. sudo ./config -fPIC -shared

  4. sudo make && sudo install

    现在,将 openssl 共享库添加到您的 PATH。

  5. vim ~/.profile Go export PATH="/usr/local/openssl/lib:$PATH" :wq

编译Python3

这里的关键是理解你定义的路径 --with-openssl= 是 Python 寻找/openssl/lib 的地方。你需要把openssl目录的父目录给Python 。

这意味着,如果您设置了,即使日志显示 openssl 正常, --with-openssl=/usr/local/openssl make install也会失败make

--enable-optimizations 不相关但推荐 - 更长的时间使 Python 代码速度提高 10% 是一个很好的权衡。

--prefix= 如果您不知道,那只是我希望安装 python3 的地方。

  1. sudo make distclean

    编辑你的python安装文件

  2. vim /{yourpythonsource}/Modules/Setup

    取消注释以下几行并确保您的 SSL 变量指向您的 openssl 目录。在我的情况下,它正在寻找目录“ssl”而不是“openssl”。

    # Socket module helper for SSL support; you must comment out the other

    # socket line above, and possibly edit the SSL variable:

    SSL=/usr/local/openssl _ssl _ssl.c \ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ -L$(SSL)/lib -lssl -lcrypto

  3. sudo ./configure --with-openssl=/usr/local --prefix=/opt/python-3.7.1

  4. sudo make && sudo make install

  • 为什么需要将 ssl 共享库添加到 PATH 中?您的意思是将其添加到 LD_LIBRARY_PATH 吗? (2认同)

Sim*_*ver 7

虽然这可能不是最好的答案,但我将分享我是如何解决这个问题的。

  1. 首先,就我而言,OpenSSL 没有正确构建,make test返回错误也是如此(因此 Python 给出了这个错误)。这是通过安装更新​​版本的 Perl 然后再次安装 OpenSSL(配置、制作等)来解决的。

  2. 在使用 ./configure 之前使用此命令

    导出 LD_LIBRARY_PATH=/path/to/openssl/lib:$LD_LIBRARY_PATH

  3. 在配置命令中,包括库:

    LDFLAGS="-L/path/to/openssl/lib" ./configure (所有你喜欢的选项) --with-openssl=/path/to/openssl

    显然, configure 选项不会将消息传达给需要它的 C 编译器。

我不确定是否同时需要选项 2 和选项 3,但我这样做了并且它奏效了。

  • 我已经尝试了网上找到的所有内容,但没有任何效果,直到我在 ./configure 期间尝试了您的“LDFLAGS=-L/path/to/openssl/lib”建议。我已经使用 LD_LIBRARY_PATH 和所有其他建议完成了所有操作,但在此之前没有一个起作用。谢谢你终于成为拯救我的人! (2认同)

lvi*_*vii 7

无需使用自定义的 openssl编辑Modules/Setuppython 构建的文件。

\n

我在Debian 9stretchpython 3.11.0-rc2下按照官方文档构建:

\n

https://docs.python.org/3/using/unix.html?highlight=openssl#custom-openssl

\n
\n

openssl.cnf要使用您的供应商\xe2\x80\x99s OpenSSL 配置和系统信任存储,请找到包含文件或符号链接的目录/etc。在大多数发行版上,文件位于/etc/ssl/etc/pki/tls. 该目录还应包含 cert.pem 文件和/或 certs 目录。

\n
$ find /etc/ -name openssl.cnf -printf "%h\\n"\n/etc/ssl\n
Run Code Online (Sandbox Code Playgroud)\n

下载、构建并安装 OpenSSL。确保您使用的是install_sw不是 install。目标install_sw不会覆盖.openssl.cnf

\n
$ curl -O https://www.openssl.org/source/openssl-VERSION.tar.gz\n$ tar xzf openssl-VERSION\n$ pushd openssl-VERSION\n$ ./config \\\n--prefix=/usr/local/custom-openssl \\\n--libdir=lib \\\n--openssldir=/etc/ssl\n$ make -j1 depend\n$ make -j8\n$ make install_sw\n$ popd\n
Run Code Online (Sandbox Code Playgroud)\n

使用自定义 OpenSSL 构建 Python(请参阅配置--with-openssl--with-openssl-rpath选项)

\n
$ pushd python-3.x.x\n$ ./configure -C \\\n--with-openssl=/usr/local/custom-openssl \\\n--with-openssl-rpath=auto \\\n--prefix=/usr/local/python-3.x.x\n$ make -j8\n$ make altinstall\n
Run Code Online (Sandbox Code Playgroud)\n
\n

安装后ssl 模块检查正常:

\n
$ find /etc/ -name openssl.cnf -printf "%h\\n"\n/etc/ssl\n
Run Code Online (Sandbox Code Playgroud)\n