Impossible de mettre à jour pip en raison de SSL

problème

Aperçu

J'ai essayé de mettre à jour pip, et lorsque j'ai exécuté la commande, je n'ai pas pu mettre à jour car ssl ne fonctionnait pas.

Solution

Il s'est avéré qu'en raison de la mise à niveau, je n'ai pas pu trouver la bibliothèque openssl qui se trouvait lorsque j'ai installé python. Cette fois, l'ancienne version d'openssl est restée, donc j'ai pu le résoudre en utilisant install_name_tool pour me dire l'emplacement de la bibliothèque partagée ou en recollant le lien symbolique.

environnement

un problème est survenu

J'ai essayé de mettre à jour pip, et quand j'ai exécuté la commande, j'ai eu une erreur disant que ssl ne fonctionnait pas et ne pouvait pas mettre à jour.

hoge-Macbook:~ hoge$ pip install -U pip
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
Requirement already up-to-date: pip in ./.pyenv/versions/3.6.3/lib/python3.6/site-packages (19.3.1)
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping

Lorsque j'ai essayé d'importer ssl à partir du shell python, j'ai eu une erreur indiquant que la bibliothèque était introuvable.

>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/ssl.py", line 101, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: dlopen(/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
  Reason: image not found

Poursuite de la cause

Il semble que la bibliothèque dynamique /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so soit foirée, donc cela dépend d'otool. J'ai vérifié la bibliothèque. En conséquence, il a été constaté qu'openssl nécessite la version 1.0.0 de la bibliothèque.

hoge-Macbook:Users hoge$ otool -L /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so:
	/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

Cependant, le répertoire (/ usr / local / opt / openssl / lib) qui devrait contenir la bibliothèque 1.0.0 contenait 1.1.

hoge-Macbook:Users hoge$ ls /usr/local/opt/openssl/lib
engines-1.1		libcrypto.a		libssl.1.1.dylib	libssl.dylib
libcrypto.1.1.dylib	libcrypto.dylib		libssl.a		pkgconfig
ls -l /usr/local/opt/
lrwxr-xr-x  1 hoge  admin  28  4 29 12:41 openssl -> ../Cellar/[email protected]/1.1.1f

Cela signifie que 1.0.0 est manquant et que vous obtenez une erreur, vous devez donc trouver openssl.

Faire face

Quand je l'ai cherché, il semble que openssl (ver1.0.0) était toujours sur le mac, j'ai donc décidé de vous indiquer le répertoire où se trouve 1.0.0.

Solution de contournement 1. Utilisez install_name_tool pour réécrire l'emplacement de la bibliothèque

J'ai réécrit l'emplacement des deux bibliothèques dépendantes libssl.1.0.0.dylib et libcrypto.1.0.0.dylib qui sont apparues lorsque j'ai exécuté otool à l'emplacement correct en utilisant install_name_tool.

install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/Cellar/openssl/1.0.2s/lib/libssl.1.0.0.dylib /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/Cellar/openssl/1.0.2s/lib/libcrypto.1.0.0.dylib /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
hoge-Macbook:procon hoge$ otool -L /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so:
	/usr/local/Cellar/openssl/1.0.2s/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/openssl/1.0.2s/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

Solution de contournement 2. Réécrire le lien symbolique

Même si vous n'utilisez pas install_name_tool, vous pouvez le corriger en rétablissant le lien symbolique et en pointant vers 1.0.0.

ln -nfs /usr/local/Cellar/openssl/1.0.2s/ /usr/local/opt/openssl

résultat

Vous pouvez importer SSL en prenant la solution de contournement 1 ou 2, et pip J'ai pu mettre à jour.

Recommended Posts

Impossible de mettre à jour pip en raison de SSL
Lorsque j'essaye d'utiliser pip, le module SSL n'est pas disponible.
[Remarque] QXcbConnection: impossible de se connecter à l'affichage
Si pip s'arrête à cause de SSL, il est préférable de réinstaller python lui-même
Que faire si vous obtenez Impossible de récupérer l'URL 443 avec pip
Une commande pour mettre à jour automatiquement la bibliothèque pip dans un batch
Comment installer pip
Comment mettre à jour easy_install
Comment mettre à jour Spyder
mettre à jour django version 1.11.1 vers 2.2
Comment vérifier quand le serveur python-memcached n'a pas pu être connecté
[virtualbox] Que faire lorsque [Impossible de récupérer la liste des miroirs] apparaît lorsque la mise à jour yum est effectuée sur CentOS7
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.