crypto - Actualización de openssl en python 2.7
python-openssl (5)
El SSL obsoleto es un problema común en múltiples plataformas:
Aquí está el enfoque general ...
0. Instalar OpenSSL
Opción I: Instalar paquetes del sistema de paquetes libs (-dev o -devel) de OpenSSL 1.x uno al lado del otro.
# FreeBSD pkg install openssl OPENSSL_ROOT=/usr/local # Mac (brew) brew install openssl # DO NOT DO ANY WEIRD SYMLINK HACKS, ITS KEG-ONLY FOR A REASON! OPENSSL_ROOT="$(brew --prefix openssl)"
Opción II: Instalar OpenSSL desde el origen a un directorio temporal
OPENSSL_ROOT="$HOME/.build/openssl-1.0.1e" curl http://www.openssl.org/source/openssl-1.0.1e.tar.gz | tar zxvf - cd openssl-1.0.1e mkdir -p "$OPENSSL_ROOT" ./config no-hw --prefix="$OPENSSL_ROOT" --openssldir=... # osx (instead of previous line): ./Configure darwin64-x86_64-cc no-hw --prefix="$OPENSSL_ROOT" --openssldir=... make install cd .. rm -rf openssl-1.0.1e
1. Construyendo Python desde la fuente
Opción A : usar pyenv :
export CONFIGURE_OPTS="CPPFLAGS=-I"$OPENSSL_ROOT"/include LDFLAGS=-L"$OPENSSL_ROOT"/lib [your other options here]" pyenv install 2.7.6
Opción B : Instalar Python desde la fuente
./configure CPPFLAGS="-I$OPENSSL_ROOT/include" LDFLAGS="-L$OPENSSL_ROOT/lib" [your other options here]` make # ... # if compiled openssl was used, it can be safely deleted because python''s module ssl links openssl statically.
Ejemplo: FreeBSD 9.2 (omitiendo la make install
para propósitos de demostración)
pkg install openssl curl gmake gdbm sqlite3 readline ncurses
OPENSSL_ROOT=/usr/local
curl http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz | tar jxvf -
cd Python-2.7.6
./configure CPPFLAGS="-I$OPENSSL_ROOT/include" LDFLAGS="-L$OPENSSL_ROOT/lib" [your other options here]
make
./python -c ''import ssl; print(ssl.OPENSSL_VERSION)'' # osx: ./python.exe ...
# prints: OpenSSL 1.0.1e 11 Feb 2013
Después, las bibliotecas temporales de openssl ya no son necesarias b / c el modelo ssl con openssl estáticamente en el ejecutable python (verifique usando el otool
o readelf
).
preguntándome si alguien puede explicar cómo funciona openssl en python2.7. No estoy seguro de si Python tiene su propio openssl o lo recoge de la máquina local / env?
déjame explicarte: (si hago esto en Python)
>>> import ssl
>>> ssl.OPENSSL_VERSION
''OpenSSL 0.9.8x 10 May 2012''
(En terminal)
$ openssl version
OpenSSL 0.9.8x 10 May 2012
$ which openssl
/usr/bin/openssl
ahora actualicé openssl (descargado)
$ cd openssl-1.0.1c
$ ./Configure darwin64-x86_64-cc --prefix=/usr --openssldir=/opt/local/etc/openssl shared
$ make
$ sudo make install
esto creó el director por separado (como se especifica), así que lo copié al viejo camino
cp -f /usr/local/ssl/bin/openssl /usr/bin/openssl
ahora en la terminal la versión de openssl ha sido actualizada pero no desde Python!
$ openssl version
OpenSSL 1.0.1c 10 May 2012
Me di cuenta de que .dylib todavía apunta a la versión anterior, ¿cómo puedo cambiar esto?
$ ls -l /usr/lib/*ssl*
-rwxr-xr-x 1 root wheel 411680 Jul 17 2012 /usr/lib/libssl.0.9.7.dylib
-rwxr-xr-x 1 root wheel 602800 May 24 03:43 /usr/lib/libssl.0.9.8.dylib
-rwxr-xr-x 1 root wheel 390908 Sep 9 17:37 /usr/lib/libssl.1.0.0.dylib
lrwxr-xr-x 1 root wheel 18 Jul 17 2012 /usr/lib/libssl.dylib -> libssl.0.9.8.dylib
Actualización : Cambié el enlace que todavía tiene la versión anterior en python.
$ ls -l /usr/lib/*ssl*
-rwxr-xr-x 1 root wheel 411680 Jul 17 2012 /usr/lib/libssl.0.9.7.dylib
-rwxr-xr-x 1 root wheel 602800 May 24 03:43 /usr/lib/libssl.0.9.8.dylib
-rwxr-xr-x 1 root wheel 390908 Sep 9 17:37 /usr/lib/libssl.1.0.0.dylib
lrwxr-xr-x 1 root wheel 18 Sep 11 15:47 /usr/lib/libssl.dylib -> libssl.1.0.0.dylib
Esto podría deberse a una versión obsoleta de Python.
Después de ejecutar python -c "import ssl; print ssl.OPENSSL_VERSION"
en Python 2.7.1, vi que tenía esta versión obsoleta: OpenSSL 0.9.7l 28 Sep 2006
.
Parece como si mi versión de Python dependiera de una versión en desuso de OpenSSL, como lo indica este foro :
Para la próxima versión de Python 2.7.9 (prevista para principios de diciembre), tengo la intención de que los Pythons en los instaladores de python.org OS X utilicen sus propias versiones de OpenSSL y, por lo tanto, ya no dependan del ahora obsoleto sistema OpenSSL.
Actualicé a Python 2.7.9 y el problema se solucionó de inmediato. Ahora, después de ejecutar python -c "import ssl; print ssl.OPENSSL_VERSION"
, recibo OpenSSL 0.9.8za 5 Jun 2014
.
Lo siguiente funcionó para mí. Ya pude actualizar OpenSSL de 0.9.8zh a una versión de 1.0.2o, pero python nunca accedió a la versión más nueva hasta que encontré esta sugerencia para usar pyenv para reinstalar Python (con 2.7.10, la versión que quería).
brew update
brew install pyenv
echo ''eval "$(pyenv init -)"'' >> .bashrc
source .bashrc
pyenv install 2.7.10
pyenv global 2.7.10
y luego verificar ...
python --version
Python 2.7.10
python -c ''import ssl; print ssl.OPENSSL_VERSION''
OpenSSL 1.0.2o 27 Mar 2018
Tuve que reinstalar paquetes de Python, por supuesto.
Por favor, consulte http://rkulla.blogspot.kr/2014/03/the-path-to-homebrew.html
Después de actualizar openssl a 1.0.1j por homebrew en MAC, pero el sistema python aún hace referencia a la versión anterior 0.9.8. Resultó que el pitón se refería a openssl. Así que he instalado una nueva python con openssl preparado y finalicé este problema en Mac, todavía no en Ubuntu.
En Mac OS X versión 10.10 y sistema Python versión 2.7.6, mi procedimiento es el siguiente:
$ brew update
$ brew install openssl
Luego puede ver la versión 1.0.1j de openssl.
$ brew link openssl --force
$ brew install python --with-brewed-openssl
Tienes que instalar una nueva python con openssl preparado. Luego, puedes ver /usr/local/Cellar/python/2.7.8_2/bin/python.
$ sudo ln -s /usr/local/Cellar/python/2.7.8_2/bin/python /usr/local/bin/python
Por supuesto, / usr / local / * debería ser propiedad de $ USER, no root, que Ryan lo cuenta, pero yo usé ''sudo''. Y, antes de esta instrucción, no tenía / usr / local / bin / python. Después de esta instrucción, puede usar la versión 2.7.8 de Python no 2.7.6.
Finalmente, puedes ver como belows;
$ python --version
Python 2.7.8
$ python -c "import ssl; print ssl.OPENSSL_VERSION"
OpenSSL 1.0.1j 15 Oct 2014
Hasta ahora, estoy trabajando en Ubuntu 12.04. Si tengo una solución para Ubuntu 12.04, actualizaré mi respuesta. Espero que este procedimiento te ayude.
SOLUCIONADO SIN HACKS, ninguno de los anteriores funcionó para mí. Terminé tomando un enfoque más simple y sin complicaciones ....
- Instala Python 2.7.13 desde el sitio oficial, en realidad se instala como el pitón predeterminado, actualizando automáticamente el viejo sistema python (¡sí!).
https://www.python.org/downloads/mac-osx/
- Actualiza openssl después de la instalación de Python. Actualizándolo para el sistema python (¡sí!).
sudo pip install --upgrade pyOpenSSL
- Tendrás que volver a instalar todos tus módulos de python (porque reemplazaste a python), te recomiendo usar pip. Después de unos minutos de instalación de pip, mi Python OSX predeterminado se actualizó, tuve la actualización de openssl y tenía todos mis módulos (incluido django en ejecución).