Reputation: 1266
Building Python 3.7 from source runs into following error:
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
I tried so many workarounds from other stackoverflow-questions, but it doesnt work. I build newest OpenSSL and LibreSSL from source. OpenSSL path is: "/usr/local/ssl" with version 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
My system: Ubuntu 12.04.5 LTS
Any ideas?
Upvotes: 45
Views: 124887
Reputation: 38432
I ran into this on an up-to-date Debian Bookworm system with libssl-dev
installed, and didn't think it should be necessary to build my own openssl. So I ran bash -x ./configure --prefix=/usr/local > config_err.log 2>&1
. Found out it was using an older openssl installation under /usr/local/. I renamed /usr/local/ssl to /usr/local/ssl.20190819, and added that same suffix to /usr/local/lib/libssl.a, /usr/local/lib/libcrypto.a, and /usr/local/include/openssl. The log I made still shows it looking for those under /usr/local, but since it can't, obviously it's finding the correct headers and libs under /usr.
Upvotes: 0
Reputation: 824
Install Python 3.12/3.10 with openssl on ubuntu 20.04:
https://github.com/davideuler/programming-tips/blob/main/python/install_python_3.12_ubuntu.md
Upvotes: 0
Reputation: 6891
My system is an older centos, I am trying to build the latest version stable release of python 3.11.5 (Sep 8, 2023). After many hours of tracing, I found that python needs > 1.1.1 ssh version (openssl). After several attemps to install the latest version of ssl (the latest for my OS turned out to be 1.0.x opensssl-devel package). So I have to resort to manual install from tar file of openssl.
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
make; sudo make install
After install, update system package info:
sudo echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
For the above command must sudo su to execute the command.
under su do
# echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
After that do
sudo ldconfig
When open ssl is successfully built, it is time to build python3.
./configure --with-ensureenter code here
pip=insten
enter code hereter code here
all --enable-shared --with-openssl=/usr/local/openssl --enable-optimizations --prefix $FOO_HOME
Upvotes: 1
Reputation: 127
There was NO need to edit Modules/Setup
file built python with customed openssl.
I have built python 3.11.0-rc2
under Debian 9 stretch follow the official document:
https://docs.python.org/3/using/unix.html?highlight=openssl#custom-openssl
To use your vendor’s OpenSSL configuration and system trust store, locate the directory with
openssl.cnf
file or symlink in/etc
. On most distribution the file is either in/etc/ssl
or/etc/pki/tls
. The directory should also contain a cert.pem file and/or a certs directory.$ find /etc/ -name openssl.cnf -printf "%h\n" /etc/ssl
Download, build, and install OpenSSL. Make sure you use
install_sw
and NOTinstall
. Theinstall_sw
target does NOT overrideopenssl.cnf
.$ curl -O https://www.openssl.org/source/openssl-VERSION.tar.gz $ tar xzf openssl-VERSION $ pushd openssl-VERSION $ ./config \ --prefix=/usr/local/custom-openssl \ --libdir=lib \ --openssldir=/etc/ssl $ make -j1 depend $ make -j8 $ make install_sw $ popd
Build Python with custom OpenSSL (see the configure
--with-openssl
and--with-openssl-rpath
options)$ pushd python-3.x.x $ ./configure -C \ --with-openssl=/usr/local/custom-openssl \ --with-openssl-rpath=auto \ --prefix=/usr/local/python-3.x.x $ make -j8 $ make altinstall
ssl module check OK after installed :
# /usr/local/python-3.11.0-rc2/bin/python3.11 -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 1.1.1q 5 Jul 2022
Upvotes: 8
Reputation: 402
how i managed to fix it for python 3.11.4: Centos7
first install openssl:
sudo yum -y groupinstall "Development Tools"
wget https://www.openssl.org/source/openssl-3.0.9.tar.gz
tar xvf openssl-3.0.9.tar.gz
cd openssl-3.0.9/
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
make -j $(nproc)
sudo make install
sudo ldconfig
sudo tee /etc/profile.d/openssl.sh<<EOF
export PATH=/usr/local/openssl/bin:\$PATH
export LD_LIBRARY_PATH=/usr/local/openssl/lib:\$LD_LIBRARY_PATH
EOF
source /etc/profile.d/openssl.sh
next install python:
wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz
tar xvf Python-3.11.4.tgz
cd Python-3.11*/
LDFLAGS="${LDFLAGS} -Wl,-rpath=/usr/local/openssl/lib" ./configure --with-openssl=/usr/local/openssl
make
sudo make altinstall
Upvotes: 0
Reputation: 11
after make and make install openssl, as you can justopenssl version
,
edit python configure
sudo ./configure --with-openssl-rpath=auto --enable-optimizations
,
and then make and make install python
Upvotes: 1
Reputation: 11
Execute till download python (3.10.4 is what i tried) from the link below https://computingforgeeks.com/install-latest-python-on-centos-linux/
Upgrade openssl as documented in https://cloudwafer.com/blog/installing-openssl-on-centos-7/
modify $python_home/Modules/Setup
Update the OPENSSL location and uncomment the below lines
--------------------------------------------
OPENSSL=/usr/local/ssl
_ssl _ssl.c \
-I$(OPENSSL)/include -L$(OPENSSL)/lib \
-lssl -lcrypto
--------------------------------------------
Continue the installation steps from https://computingforgeeks.com/install-latest-python-on-centos-linux/
Hope it helps somebody.. fyi: I was installing this on a centos7 ec2 instance as a part of installing ansible.
Upvotes: 1
Reputation: 339
Download your openssl tarball, unzip, and then ensure that the install directory is named
openssl
.
I placed mine in /usr/local/openssl, so I'll use that in my example.
sudo mv openssl-1.0.2u /usr/local/openssl && cd /usr/local/openssl
sudo make distclean
sudo ./config -fPIC -shared
sudo make && sudo install
Now, add the openssl shared library to your PATH.
vim ~/.profile
Go
export LD_LIBRARY_PATH="/usr/local/openssl/lib:$LD_LIBRARY_PATH"
:wq
The key here is understanding that the path you define with
--with-openssl=
is where Python looks for /openssl/lib. You need to give Python the parent directory of the openssl directory.
That means that if you set
--with-openssl=/usr/local/openssl
yourmake install
will fail even though themake
logs show that openssl is fine!
--enable-optimizations
is irrelevant but recommended - longer make for 10% faster Python code is a good tradeoff.
--prefix=
is merely where I'd like python3 to install, if you didn't know.
sudo make distclean
Edit your python setup file
vim /{yourpythonsource}/Modules/Setup
Uncomment out the following lines and ensure that your SSL variable points to your openssl directory. In mine, it was looking for the directory 'ssl' instead of 'openssl.'
<pre><code># Socket module helper for SSL support; you must comment out the other </code>
<pre><code># socket line above, and possibly edit the SSL variable: </code>
<code>SSL=/usr/local/openssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto</code>
sudo ./configure --with-openssl=/usr/local --prefix=/opt/python-3.7.1
sudo make && sudo make install
Upvotes: 19
Reputation: 61
I ran into this problem with LMDE 5 (running Debian Bullseye) compiling Python 3.10.4. It was fixed by doing:
sudo apt-get install libssl-dev
Upvotes: 3
Reputation: 31
Met same issue, looks configure of Python3 can't work well.
If you have installed the latest openssl, make sure the path of OPENSSL_LDFLAGS is correct in Makefile, below is my env case
OPENSSL_LDFLAGS=-L/usr/local/lib64
Upvotes: 2
Reputation: 1934
On CentOS / Linux 2 if you install openssl using
sudo yum install -y openssl-devel
then the library is installed to /usr/local/lib64, and you can configure Python as follows:
./configure --enable-shared --with-openssl=/usr/local/lib64
there are step-by-step instructions here: How to Install Latest (2020) Django to AWS EC2 Linux 2 Instance and Serve w/ Apache Hello World
Upvotes: 2
Reputation: 1392
Here is a solution on Mac OS X / Homebrew:
brew reinstall openssl
brew unlink openssl && brew link openssl --force # careful!
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
Then download your python tarball and do this:
tar xvf Python-3.7.2.tar
cd Python-3.7.2
./configure CPPFLAGS="-I/usr/local/opt/openssl/include" LDFLAGS="-L/usr/local/opt/openssl/lib" --prefix=$PWD/Python-3.7.2/mybuild --enable-optimizations
More detai:
Upvotes: -1
Reputation: 579
Edit setup.py
Find the following lines:
system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
system_include_dirs = ['/usr/include']
...and place each folder at the beginning of its respective list.
In my case I had to add: /usr/local/lib
and /usr/local/include
:
system_lib_dirs = ['/usr/local/lib', '/lib64', '/usr/lib64', '/lib', '/usr/lib']
system_include_dirs = ['/usr/local/include', '/usr/include']
Finally: make distclean && ./configure
You may want to ensure that export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
(or what have you) is added to the very end of /etc/profile
and reboot, as well.
Upvotes: 1
Reputation: 6630
I solved it after 3 days only because of this blog. with python 3.7.4 openssl 1.1.0 centOS 6.
here is the summary :
First, some prerequisites:
sudo apt-get install build-essential checkinstall libreadline-gplv2-dev libncursesw5-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
use yum instead of apt-get if using centos linux.
Install ssl 1.0.2 or higher.
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
We will need to pass /usr/src/openssl-1.0.2o into the Python configure script.
mkdir lib
cp ./*.{so,so.1.0.0,a,pc} ./lib
Now proceed with installing 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
To test it out, run python3.7 and input:
import ssl
ssl.OPENSSL_VERSION
Hope it helps!
Upvotes: 52
Reputation: 528
While this might not be the best answer, I will share how I solved this problem.
First of all, in my case, OpenSSL did not build correctly, as make test
did return errors (and consequently Python gave this error). This was solved by installing a newer version of Perl and then installing OpenSSL again (configure, make, etc).
Use this command before using ./configure
export LD_LIBRARY_PATH=/path/to/openssl/lib:$LD_LIBRARY_PATH
At the configure command, include the library:
LDFLAGS="-L/path/to/openssl/lib" ./configure (all your preferred options) --with-openssl=/path/to/openssl
as apparently the option for configure does not convey the message to the C compiler which needs it.
Am not sure whether option 2 and 3 are needed simultaneously, but I did so and it worked.
Upvotes: 14