Esta pagina se ve mejor con JavaScript habilitado

Python auto-contenido en un directorio local con OpenSSL compilado manualmente

 ·  🎃 kr0m

En un artículo anterior ya explicamos como compilar Python en un directorio local, esto resulta muy útil en sistemas desactualizados en los que resulta imposible instalar nada pero si el sistema es extremadamente antiguo dará problemas incluso cuando conecte con servidores externos por SSL ya que el cifrado del cliente y el servidor no serán compatibles, esto implica que no podremos instalar nada desde Pip.

Para solventar esto compilaremos de forma externa OpenSSL y luego Python incluyendo las librerías de criptográficas que hemos compilado manualmente, de este modo tendremos un entorno completo de Python actualizado.

Si estamos en un sistema Ubuntu instalaremos las dependencias necesarias para compilar Python.

apt install zlib1g-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev libtk8.5 libgdm-dev libdb4o-cil-dev libpcap-dev

NOTA: En caso de tratarse de Gentoo o FreeBSD ya viene todo instalado.

Clonamos el repositorio de OpenSSL y compilamos las fuentes:

git clone git://git.openssl.org/openssl.git
mv openssl opensslRepo
cd opensslRepo
./config --prefix=$HOME/openssl --openssldir=$HOME/openssl
make -j8
make install

Bajamos el código de la versión de Python que deseemos y desenpaquetamos el fichero:

cd
wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
tar -xvf Python-3.9.0.tgz
cd Python-3.9.0

Editamos el fichero Setup donde editaremos el parámetro SSL y descomentaremos el resto de líneas mostradas:

vi Modules/Setup

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

Dependiendo del sistema operativo que estemos utilizando incluiremos las librerias OpenSSL en el proceso de compilación de un modo u otro.

ldconfig -m /root/openssl/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/openssl/lib

Compilamos las fuentes:

./configure --prefix=$HOME/Python-3.9.0/Python --with-openssl=/root/openssl --enable-optimizations
make -j8
make install

Comprobamos la versión de Python:

Python/bin/python3 -V

Python 3.9.0

Comprobamos la versión OpenSSL con la que Python fué compilado:

Python/bin/python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"

OpenSSL 3.0.0-alpha8-dev 

Mediante pip podremos instalar las librerías que deseemos:

Python/bin/python3 -m pip install ovh cymruwhois godaddypy dnspython --user

Es importante recalcar que debemos incluir nuestras librerías OpenSSL en cada ejecución de nuestro Python, de lo contrario no encontrará las librerías con las que fué compilado:

/root/Python-3.6.9/Python/bin/python3: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

ldconfig -m /root/openssl/lib  
Python/bin/python3 SCRIPT_NAME
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/openssl/lib  
Python/bin/python3 SCRIPT_NAME

Si la ejecución es manual podemos incluir las librerías como se ha indicado, en caso de querer ejecutarlo de forma desasistida, por ejemplo desde un Cron, la mejor opción es crear un script en Bash que haga los dos pasos, incluir las librerías y ejecutar el script en Python.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí