No se pueden instalar paquetes de Python [SSL: TLSV1_ALERT_PROTOCOL_VERSION]
Estoy intentando instalar una biblioteca de Python usando pip
y aparece un error de SSL:
~/projects/base pre-master± pip install xdict
Collecting xdict
Could not fetch URL https://pypi.python.org/simple/xdict/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) - skipping
Could not find a version that satisfies the requirement xdict (from versions: )
No matching distribution found for xdict
versión de pip: pip 9.0.1
¿Cómo soluciono este error?
Actualice pip de la siguiente manera:
curl https://bootstrap.pypa.io/get-pip.py | python
Nota: Es posible que necesite utilizar sudo python
lo anterior si no está en un entorno virtual.
(Tenga en cuenta que actualizar pip
usando pip
ie pip install --upgrade pip
tampoco lo actualizará correctamente. Es solo una cuestión del huevo y la gallina. pip
No funcionará a menos que use TLS >= 1.2.)
Como se menciona en esta respuesta detallada , esto se debe a la reciente desaprobación de TLS para pip. Los sitios Python.org han dejado de admitir las versiones 1.0 y 1.1 de TLS.
Desde la página de estado de Python:
Completado : las caídas de tensión continuas han finalizado y TLSv1.0 y TLSv1.1 se han desactivado. 11 de abril a las 15:37 UTC
Para usuarios de PyCharm (virtualenv):
Ejecute el entorno virtual con shell. (reemplace "./venv/bin/activate" por su propia ruta)
source ./venv/bin/activate
Ejecutar actualización
curl https://bootstrap.pypa.io/get-pip.py | python
Reinicie su instancia de PyCharm y verifique su intérprete de Python en Preferencia .
Pero si el curl
comando en sí falla con un error, o la "versión del protocolo de alerta tlsv1" persiste incluso después de la actualización pip
, significa que la versión de la biblioteca OpenSSL subyacente de su sistema operativo < 1.0.1
o la versión de Python < 2.7.9
(o < 3.4
en Python 3) no son compatibles con el protocolo TLS 1.2 más nuevo. que pip
necesita conectarse a PyPI desde hace aproximadamente un año . Puedes comprobarlo fácilmente en el intérprete de Python:
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8o 01 Jun 2010'
>>> ssl.PROTOCOL_TLSv1_2
AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2'
El AttributeError
(en lugar del '5' esperado) significa que su ssl
módulo Python stdlib, compilado con la antigua biblioteca openssl, carece de soporte para el protocolo TLSv1.2 (incluso si la biblioteca openssl puede actualizarse más adelante).
Afortunadamente, se puede resolver sin actualizar Python (y todo el sistema), instalando manualmente paquetes adicionales de Python; la guía detallada paso a paso está disponible aquí en Stackoverflow .
Tenga en cuenta que
curl
y todos dependen de la misma biblioteca OpenSSL para establecer conexiones SSL (usepip
el comando). libcurl admite TLS 1.2 desde la versión 7.34 de curl , pero las versiones anteriores de curl deberían poder conectarse si tenía OpenSSL versión 1.0.2 (o posterior).wget
$ openssl version
PD:
Para Python 3 , utilicepython3
ypip3
en todas partes (a menos que esté en venv/virtualenv), incluido elcurl
comando de arriba :
$ curl https://bootstrap.pypa.io/get-pip.py | python3 --user
Seguir la respuesta de @Anupam en OS X me generó el siguiente error, independientemente de los permisos con los que lo ejecuté:
No se pudieron instalar paquetes debido a un EnvironmentError: [Errno 13] Permiso denegado:...
Lo que finalmente funcionó fue descargar un paquete pip más nuevo (9.0.3) de PyPI directamente desde mi navegador: https://pypi.org/simple/pip/ , extraer el contenido y luego instalar pip el paquete localmente:
pip install ./pip-9.0.3/
Esto solucionó mis [SSL: TLSV1_ALERT_PROTOCOL_VERSION]
errores.
La solución de @Anupam funcionó para mí. Sin embargo, tuve que usar sudo
y especificar la ubicación exacta de mi entorno virtual Python:
curl https://bootstrap.pypa.io/get-pip.py | sudo /Users/{your user name}/{path to python}/bin/python
Para actualizar la versión local utilicé una ligera variante:
curl https://bootstrap.pypa.io/get-pip.py | python - --user
Este problema surge si mantiene su pip y sus paquetes en su directorio de inicio como se describe en esta esencia .