ssl.SSLError: version du protocole d'alerte tlsv1
Je suis l'aide de l'API pour un Cisco CMX appareil
Et en essayant d'écrire du code Python qui fait une requête à l'API pour plus d'informations. Le code est comme suit et il est le même que dans le fichier, sauf l'information nécessaire changé.
from http.client import HTTPSConnection
from base64 import b64encode
# Create HTTPS connection
c = HTTPSConnection("0.0.0.0")
# encode as Base64
# decode to ascii (python3 stores as byte string, need to pass as ascii
value for auth)
username_password = b64encode(b"admin:password").decode("ascii")
headers = {'Authorization': 'Basic {0}'.format(username_password)}
# connect and ask for resource
c.request('GET', '/api/config/v1/aaa/users', headers=headers)
# response
res = c.getresponse()
data = res.read()
Cependant, je suis en permanence faire l'erreur suivante:
Traceback (most recent call last):
File "/Users/finaris/PycharmProjects/test/test/test.py", line 14, in <module>
c.request('GET', '/api/config/v1/aaa/users', headers=headers)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1106, in request
self._send_request(method, url, body, headers)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1151, in _send_request
self.endheaders(body)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1102, in endheaders
self._send_output(message_body)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 934, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 877, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1260, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 377, in wrap_socket
_context=self)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 752, in __init__
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 988, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 633, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:645)
J'ai aussi essayé la mise à jour d'OpenSSL, mais qui n'avait aucun effet.
source d'informationauteur finaris
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même message d'erreur et google m'a amené à cette question, voici donc ce que j'ai fait, en espérant que cela aide les autres dans une situation similaire.
Ceci est applicable pour les OS X.
Vérifier dans le Terminal de la version de OpenSSL j'ai eu:
Que ma version de OpenSSL était trop vieux, l'on a accepté la réponse n'a pas de travail.
Donc j'ai eu à mettre à jour OpenSSL. Pour ce faire, j'ai mis à jour Python à la version la plus récente (à partir de la version 3.5 à partir de la version 3.6) avec Homebrew, à la suite de certaines des mesures suggérées ici:
Puis j'ai eu des problèmes avec le CHEMIN d'accès et la version de python utilisée, donc je viens de créer un nouveau
virtualenv
s'assurer que la dernière version de python a été prise:Problème résolu.
La seule chose que vous avez à faire est d'installer
requests[security]
dans votre virtualenv. Ne vous inquiétez pas à propos de la mise à niveau vers Python 3, ou à l'aide de brew à l'installation d'openssl.requests[security]
permet à des demandes d'utilisation de la dernière version de TLS lors de la négociation de la connexion. Le haut-openssl sur MacOS prend en charge TLS v1.2.Aucune des réponses acceptées m'a orienté dans la bonne direction, et c'est toujours la question qui est soulevée lors de la recherche du sujet, donc voici mon (partiellement) le succès de la saga.
Contexte: - je exécuter un script Python sur un Beaglebone Black qui interroge le cryptocurrency échange Poloniex à l'aide de la python-poloniex de la bibliothèque. Il a soudainement arrêté de travailler avec le TLSV1_ALERT_PROTOCOL_VERSION erreur.
S'avère que OpenSSL était très bien, et d'essayer de forcer une v1.2 connexion a été un énorme wild goose chase - la bibliothèque de l'utilisation de la dernière version que nécessaire. Le maillon faible de la chaîne a été fait en Python, qui défini
ssl.PROTOCOL_TLSv1_2
et donc commencé à prendre en charge TLS v1.2, depuis la version 3.4.Pendant ce temps, la version de Debian sur le Beaglebone estime de Python 3.3, la dernière. La solution de contournement que j'ai utilisé était d'installer Python 3.5 à partir des sources (3.4 pourrait avoir finalement travaillé trop, mais après des heures d'essais et d'erreurs que j'ai terminé):
Peut-être pas tous les paquets qui sont strictement nécessaires, mais l'installation de tous à la fois enregistre un tas de tentatives. Le
altinstall
empêche de l'installer à partir de casser existant python binaires, installation en tant quepython3.5
au lieu de cela, bien que cela ne signifie pas que vous avez à ré-installer d'autres bibliothèques. Le./configure
a pris un bon cinq ou dix minutes. Lemake
a pris deux heures.Maintenant, cela ne fonctionne toujours pas jusqu'à ce que j'ai finalement couru
Qui installe également
pyOpenSSL
cryptography
etidna
. Je soupçonnepyOpenSSL
a la clé, peut-êtrepip3.5 install -U pyopenssl
aurait été suffisant, mais j'ai passé beaucoup trop de temps sur ce déjà pour s'en assurer.Donc en résumé, si vous obtenez TLSV1_ALERT_PROTOCOL_VERSION erreur en Python, c'est probablement parce que vous ne pouvez pas en charge TLS v1.2. Pour ajouter le support, vous avez besoin d'au moins les éléments suivants:
Cela m'a fait passé TLSV1_ALERT_PROTOCOL_VERSION, et maintenant, je suis à la bataille avec SSL23_GET_SERVER_HELLO à la place.
S'avère que c'est retour à l'origine du Python en sélectionnant la mauvaise version de SSL. Cela peut être confirmé en utilisant cette astuce pour le montage d'une demande de session avec
ssl_version=ssl.PROTOCOL_TLSv1_2
. Sans elle, SSLv23 est utilisé, et le SSL23_GET_SERVER_HELLO d'erreur s'affiche. Avec elle, la demande réussit.La bataille finale était à force de TLSv1_2 d'être repris lorsque la demande est faite au fond d'une bibliothèque tierce. Les deux cette méthode et cette méthode devrait avoir fait le tour, mais ne fait aucune différence. Ma dernière solution est horrible, mais efficace. J'ai édité
/usr/local/lib/python3.5/site-packages/urllib3/util/ssl_.py
et changéà
et voila, mon script peut enfin communiquer avec le serveur à nouveau.
Je crois
TLSV1_ALERT_PROTOCOL_VERSION
est pour vous indiquer que le serveur ne veut pas parler TLS v1.0 pour vous. Essayez de spécifier le protocole TLS v1.2 uniquement par collage dans ces lignes:Vous devrez peut-être suffisamment de nouvelles versions de Python (2.7.9+ peut-être?) et, éventuellement, d'OpenSSL (j'ai "OpenSSL 1.0.2 k 26 janvier 2017" et ci-dessus semble fonctionner, YMMV)
Pour Mac OS X
1) mise à Jour de Python 3.6.5 à l'aide de l'application native d'installation téléchargé à partir de l'officiel de Python site en langue https://www.python.org/downloads/
J'ai trouvé que le programme d'installation est en prenant soin de mettre à jour les liens et les liens symboliques pour le Python beaucoup mieux que homebrew.
2) Installer un nouveau certificat à l'aide de "./Installer Des Certificats.commande" qui est dans le actualisé Python 3.6 répertoire
Dans mon cas, j'ai été l'exécution de certains tiers script python à l'aide
python script.py
et python2.7 a été utilisé afin d'en j'ai été faire la même erreur. J'ai rediffusé le script à l'aide depython3 script.py
alors tout est bien.En juillet 2018, Pypi exige maintenant que les clients se connectant à utiliser le protocole TLS 1.2. Est-ce un problème si vous utilisez la version de python livré avec MacOS (2.7.10) car il ne supporte que le protocole TLS 1.0. Vous pouvez changer la version de ssl que python est l'aide à résoudre le problème ou de la mise à niveau vers une version plus récente de python. Utiliser homebrew pour installer la nouvelle version de python à l'extérieur de l'emplacement par défaut des bibliothèques.