Estoy tratando de instalar una biblioteca de Python usando pip y obtengo 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 xdictversión 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 deba usar sudo python arriba si no está en un entorno virtual.
(Tenga en cuenta que actualizar pip usando pip , es decir, pip install --upgrade pip tampoco lo actualizará correctamente. Es solo un problema 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 desaprobación reciente de TLS para pip. Los sitios de 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 terminaron y TLSv1.0 y TLSv1.1 se deshabilitaron. 11 de abril, 15:37 UTC
Para usuarios de PyCharm (virtualenv):
Ejecute un entorno virtual con shell. (reemplace "./venv/bin/activate" por su propia ruta)
source ./venv/bin/activateEjecutar actualización
curl https://bootstrap.pypa.io/get-pip.py | pythonReinicie su instancia de PyCharm y verifique su intérprete de Python en Preference .
Pero si el comando curl en sí mismo falla con un error, o la "versión del protocolo de alerta tlsv1" persiste incluso después de actualizar 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 nuevo protocolo TLS 1.2 que pip necesita para conectarse a PyPI desde hace aproximadamente un año . Puede verificarlo 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 módulo Python stdlib ssl , compilado contra la antigua lib de openssl, carece de soporte para el protocolo TLSv1.2 (incluso si la biblioteca de openssl puede o podría 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,pipywgetdependen de la misma biblioteca OpenSSL para establecer conexiones SSL (use el comando$ openssl version). libcurl admite TLS 1.2 desde curl versión 7.34 , pero las versiones anteriores de curl deberían poder conectarse si tenía OpenSSL versión 1.0.2 (o posterior).PD
Para Python 3 , usepython3ypip3todas partes (a menos que esté en un venv/virtualenv), incluido el comandocurlde arriba :
$ curl https://bootstrap.pypa.io/get-pip.py | python3 --user
Seguir la respuesta de @Anupam en OS X resultó en el siguiente error para mí, independientemente de los permisos con los que lo ejecuté:
No se pudieron instalar los 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 errores [SSL: TLSV1_ALERT_PROTOCOL_VERSION] .