如何使用自定义 OpenSSL 编译 Python 3.4?

Posted

技术标签:

【中文标题】如何使用自定义 OpenSSL 编译 Python 3.4?【英文标题】:How do I compile Python 3.4 with custom OpenSSL? 【发布时间】:2014-06-26 05:22:47 【问题描述】:

我在非标准位置安装了自己的 OpenSSL(在此示例中为 /my/path),并且我希望 Python 3.4 在针对源代码编译时构建它。我试过的是这个(目录缩写)

CPPFLAGS="-I/my/path/include -I/my/path/include/openssl" ./configure --prefix=/my/path/

我也尝试使用C_INCLUDE_PATH 和冒号分隔的路径。

然后,我运行 make 并得到这个:

building '_ssl' extension
gcc -pthread -fPIC -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I./Include -I. -IInclude -I/my/path/include -I/my/path/include/openssl -I/usr/local/include -I/my/path/Python-3.4.0/Include -I/my/path/Python-3.4.0 -c /my/path/Python-3.4.0/Modules/_ssl.c -o build/temp.linux-x86_64-3.4/my/path/Python-3.4.0/Modules/_ssl.o
gcc -pthread -shared build/temp.linux-x86_64-3.4/my/path/Python-3.4.0/Modules/_ssl.o -L/my/path/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-3.4/_ssl.cpython-34m.so
*** WARNING: renaming "_ssl" since importing it failed: build/lib.linux-x86_64-3.4/_ssl.cpython-34m.so: undefined symbol: SSL_get0_next_proto_negotiated

它正在寻找SSL_get0_next_proto_negotiated,但这是最肯定的定义:

$ grep SSL_get0_next_proto_negotiated /my/path/include/openssl/*
/my/path/include/openssl/ssl.h:void SSL_get0_next_proto_negotiated(const SSL *s,

我不确定我做错了什么,有什么想法吗?

【问题讨论】:

你有/my/path/lib/libssl.so和/或/my/path/lib/libcrypto.so的文件吗? 查看hg.python.org/cpython/file/9e55089aa505/setup.py 查找包含的逻辑... 谢谢你的链接,我去看看 更正:我有 libssl.so,但它在 /my/path/lib64/libssl.so 【参考方案1】:

经过大量的拉扯,我设法弄明白了。这是一堆环境变量......我想我可能做得有点过头了,但这基本上奏效了:

# OpenSSL 1.0.1g
./config shared --prefix=/my/path --openssldir=/my/path/openssl
make
make install

# Python 3.4
export LDFLAGS="-L/my/path/lib/ -L/my/path/lib64/"
export LD_LIBRARY_PATH="/my/path/lib/:/my/path/lib64/"
export CPPFLAGS="-I/my/path/include -I/my/path/include/openssl"
./configure --prefix=/my/path/
make
make install

【讨论】:

您可能需要在您的-Wl,-rpath=/my/path/openssl/lib 中添加LDFLAGS,以便自定义openssl lib 目录被烘焙到生成的可执行文件中。 IE。所以你不需要在运行你的python时设置LD_LIBRARY_PATH。未测试(抱歉)。 谢谢,这至少导致了一个带有 openssl 扩展的构建(其他各种配方无法完成)。 python 2.7.10,openbuildservice环境中的openssl 1.0.1。 虽然完全公开 - 我拥有我们在同一个 openbuildserver 项目中使用的所有库,因此我可以随时批量重建它们,否则不值得为这一切烦恼。 谢谢,在您的解决方案完美运行之前,我在这个问题上花费了过多的时间。对于 Python-2.7.11 和 3.5。 我一直在浪费时间来获得 SSL 支持。这个解决方案终于在 python 2.7.12 上为我做到了【参考方案2】:

感谢@ScottFrazer 的回答。为我省去了很多麻烦。

这是我在ubuntu中用最新的openssl 1.0.2g编译python的脚本。

# new openssl install
curl https://www.openssl.org/source/openssl-1.0.2g.tar.gz | tar xz && cd openssl-1.0.2g && ./config shared --prefix=/usr/local/ && make && make install

# Python install script
export LDFLAGS="-L/usr/local/lib/"
export LD_LIBRARY_PATH="/usr/local/lib/"
export CPPFLAGS="-I/usr/local/include -I/usr/local/include/openssl"
apt-get update
apt-get install build-essential checkinstall -y
apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev -y
cd /home/web/
wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz | tar xzf Python-2.7.11.tgz && cd Python-2.7.11 
./configure --prefix=/usr/local/ 
make altinstall

注意,安装是一个 altinstall,这意味着它不会覆盖 ubuntu 上的默认 python。验证安装是否成功:

/usr/local/bin/python2.7
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2g  1 Mar 2016'

【讨论】:

CPPFLAGS 用于 C 预处理器。您可能想使用CFLAGS。将相关的CFLAGS 传递给预处理器是编译器潜水员的工作。预处理器不会将相关标志传递给编译器驱动程序。【参考方案3】:

这就是我在 3.4 中解决它的方法。它适用于 2.7 和 3.4。重要的是 ./configure 中的 --with-ssl config 参数:

wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
tar -xf Python-3.4.3.tgz
cd Python-3.4.3/
sudo yum install gcc
./configure --with-ssl
make && make install
# If you like to live dangerously since this will overwrite default python executable
make && make altinstall
# Safer because you access your new Python using python3.4

【讨论】:

配置:警告:无法识别的选项:--with-ssl ./configure 是否通过了该警告?编译的 Python 是否启用了 ssl?在我看来,configure 似乎无法识别参数,但它仍然被传递,然后由 make 磨练。根据这些来源,我在那个时候挖掘了这个:bugs.python.org/issue21541 和 ***.com/questions/22409092/… 此外,如果上述方法不起作用,那么可能是(虽然我不记得很确定)我集成了上述票证中的补丁bugs.python.org/file35304/issue21541-patch.diff 请让我知道它是否适合您! 我从 configure 收到了这个警告,结果 python 缺少 ssl 模块。我使用 Scott Frazer 的解决方案以及编辑 Modules/Setup 来包含: SSL=YOUR_PREFIX _ssl _ssl.c \ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ -L$(SSL)/ lib -lssl -lcrypto ` 当我查看文档或执行./configure --help 时,我没有看到--with-ssl 选项,但这修复了我的python 3.5 安装。现在 pip 正在正确安装。

以上是关于如何使用自定义 OpenSSL 编译 Python 3.4?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 下编译 OpenSSL

如何在Windows下编译OpenSSL

如何在 Windows 下编译 OpenSSL

如何在 Windows 下编译 OpenSSL

OpenSSL生成HTTPS自签名证书

在 fedora 21 上使用自编译 OpenSSL 编译比特币