Building Python 3.7.1 - SSL module failed
Solution 1
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!
Solution 2
Compiling openssl
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
Compiling Python3
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
Solution 3
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.
Solution 4
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
Solution 5
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.
Related videos on Youtube
mcatis
Updated on May 01, 2022Comments
-
mcatis about 2 years
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?
-
mvp about 5 yearsYour Ubuntu version looks extremely old. Consider upgrading to 18.04 LTS, it will make many issues like this to simply disappear.
-
Sunil Kumar over 4 yearsPossible duplicate of ImportError: No module named _ssl
-
-
w08r over 4 yearsThe brew reinstall was the only thing that worked in my context, thank you!
-
Brad Solomon over 4 yearsYou should not need
brew link openssl --force
. It is dangerous and Brew does not symlink openssl for a good reason: "[email protected] is keg-only, which means it was not symlinked into /usr/local, because openssl/libressl is provided by macOS so don't link an incompatible version." -
blissweb almost 4 yearsVery useful getting the openssl from source. I had to make one change, setting the export LD_LIBRARY_PATH=/usr/src/openssl-1.0.2o/lib before running the configure command. This was Ubuntu 14 with Python 3.8.2. Working, yay !
-
dmgl almost 4 yearsThank you. Without edit
vim /{yourpythonsource}/Modules/Setup
as you advised i could'nt build python3.8 for raspberry pi 3 "Raspbian GNU/Linux 8 (jessie)" -
Pavel Chernikov almost 4 yearsWhy do you need to add ssl shared library to PATH? Did you mean to add it to LD_LIBRARY_PATH?
-
Xidh almost 3 yearsOnly worked after export LD_LIBRARY as @blissweb mentioned above! Using Debian 8
-
Soid over 2 yearsWork for me after tried a few other answers. I just didn't use the lib folder in openssl (e.g. just LDFLAGS="-L/path/to/openssl")
-
Mavaddat Javid over 2 yearsNice one. Your advice solved my SSL problem on
library/amazonlinux:latest
Docker image.yum install -y openssl-devel
./configure --enable-shared --with-openssl=/usr/local/lib64 --enable-optimizations
-
Mavaddat Javid over 2 yearsYes. I had to combine this
make distclean && ./configure
advice with that of @adam-winter above. Otherwise, gcc warns about "coverage_mismatch
". -
Mavaddat Javid over 2 yearsFor me the build step for
openssl
wasyum install -y tcl tcl-devel tk tk-devel
git clone git://git.openssl.org/openssl.git
cd openssl/
./config --prefix=/usr --openssldir=/etc/ssl --libdir=lib shared zlib-dynamic -Wl,-rpath=/usr/local/ssl -Wl,--enable-new-dtags
as recommended in wiki.openssl Compilation and Installation ↪ Using RPATHs. -
Tomasz Hławiczka over 2 yearsNow there is also this one:
yum install -y openssl11-devel
-Python 3.10
requiresOpenSSL 1.1.1
or newer. -
pfa about 2 yearsDidn't solve it for me. OpenSSL 1.1.1n 15 Mar 2022 (Library: OpenSSL 1.1.1k FIPS 25 Mar 2021) Could not build the ssl module! Python requires a OpenSSL 1.1.1 or newer
-
pfa about 2 yearsDitto for me on LD_LIBRARY_PATH
-
nori about 2 yearsVery late response, but you're right, I shouldn't have added a ../lib to the $PATH.
-
anshuk_pal about 2 years@TomaszHławiczka stackoverflow.com/questions/71951779/… I could not manage to have it built from 3.10 Can you please let me know, where I am going wrong