Python demandes.des exceptions.SSLError: EOF eu lieu en violation du protocole
Je voudrais extraire des informations à partir d'un ABB G13 passerelle qui offrent une RESTful API JSON. L'API est hébergé par la passerelle via https point de terminaison.
De base, le mécanisme d'authentification est utilisé pour l'authentification. Cependant, tout le trafic
passe par SSL couches.
Sur linux avec la commande:
curl -s -k -X GET -u user:password https://host/meters/a_serial/power
Tout va bien!
Je suis en train d'écrire un script pour windows en Python 2.7.10 avec les Demandes 2.8.1 et avec ce code:
import requests
requests.get('https://host/meters/a_serial/power', auth=('user', 'password'))
J'ai cette erreur:
Traceback (most recent call last):
File "C:/Users/mzilio/PycharmProjects/pwrgtw/test.py", line 20, in <module>
requests.get('https://host/meters/a_serial/power', auth=('user', 'password'))
File "C:\Python27\lib\site-packages\requests\api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "C:\Python27\lib\site-packages\requests\api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 433, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)
J'ai cherché une solution et j'ai essayé de réparer avec ce code:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl
class MyAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1)
s = requests.Session()
s.mount('https://', MyAdapter())
s.get('https://host/meters/a_serial/power')
Mais il ne fonctionne pas pour moi parce que je reçois cette erreur:
Traceback (most recent call last):
File "C:/Users/mzilio/PycharmProjects/pwrgtw/test.py", line 16, in <module>
s.get('https://host/meters/a_serial/power')
File "C:\Python27\lib\site-packages\requests\sessions.py", line 480, in get
return self.request('GET', url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 433, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)
Je suis bloqué sur ce problème. Quelqu'un pourrait-il m'aider? Merci!
Avec le correctif référencé, un nouveau message d'erreur:
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
Avez-vous jamais résoudre ce problème? Je suis arriver la même chose avec une autre question
OriginalL'auteur mzilio | 2015-10-29
Vous devez vous connecter pour publier un commentaire.
Cette chose qui a fonctionné pour moi, assurez-vous juste que ces modules soient installés ou non, si ce n'est de les installer, à la suite sont:
Elle a enlevé mon SSLError: EOF eu lieu en violation de protocole (_ssl.c:590) erreur.
Espère que cela aide.
Cela n'a rien fait pour moi.
OriginalL'auteur giving_the_world
J'ai eu exactement le même message d'erreur, s'avère que je n'ai pas
ndg-httpsclients
installé, voir mon premier question soulevées dans github.ndg-httpsclient
.OriginalL'auteur James Lin
J'ai trouvé qu'il était de passer par un proxy, alors qu'il devait connecté au serveur directement.
J'ai corrigé cela en faisant
juste dans mon terminal linux - elle annuler la https_proxy variable d'environnement.
M'a aidé, merci!
OriginalL'auteur A G
Si vous obtenez cette erreur pour les demandes, vous pouvez vous référer à la solution mentionnée dans https://github.com/requests/requests/issues/3391.
En gros, si vous faites beaucoup de demandes à un serveur et face à cette problématique avec certains de ces demandes, vous pouvez utiliser
Session
juste réessayer la demande.Laissez-moi savoir si cela fonctionne.
OriginalL'auteur varun
Étape 1: Vérifier que Python supporte TLS 1.1
Vous pouvez avoir une installation de Python qui prend uniquement en charge le protocole TLS 1.0 – pas TLS 1.1 ou supérieure.
Vous pouvez le vérifier comme ceci:
Python 3
Python 2
Vérifiez la sortie de la clé
tls_version
. Si elle ditTLS 1.0
et pasTLS 1.1
ouTLS 1.2
que pourrait être le problème.Si vous utilisez un virtualenv, assurez-vous d'exécuter la commande à l'intérieur.
Étape 2: Installer Python avec une nouvelle version de OpenSSL
Dans l'ordre de prise en charge de TLS 1.1 ou supérieur, vous devrez peut-être installer une nouvelle version de OpenSSL, et de l'installer Python à nouveau par la suite. Cela devrait vous donner un Python qui prend en charge TLS 1.1.
Le processus dépend de votre système d'exploitation – voici un guide pour OS X.
virtualenv utilisateurs
Pour moi, le Python à l'extérieur de mon virtualenv avait TLS 1.2, si juste, que j'ai supprimé mon ancien virtualenv, et créé un nouveau avec les mêmes packages et puis il a travaillé. Facile comme bonjour!
Dans ce cas, vous pourriez avoir un problème différent. Comme le manque
ndg-httpsclient
paquet comme mentionné ici stackoverflow.com/a/46467942/118608. Je sais seulement que la réponse ci-dessus (ma réponse) a fonctionné pour moiOriginalL'auteur qff
La seule fois où j'ai vu des erreurs de cette nature ont eu des moments où j'ai été en utilisant
requests
à l'écran pour recueillir des données et j'ai été en utilisant un traitement multiple de la bibliothèque. Je voudrais essayer votre code sans le gestionnaire de pool ou de diviser votre application en deux applications, l'une qui distribue de l'url et un autre qui les consume.Le client-serveur paire ici devrait vous donner quelques idées. J'ai été en mesure à l'échelle de mon client horizontalement lorsque j'ai utilisé le hacky code serveur pour charger toutes les url dans une File d'attente dans la mémoire juste avant
app.run
. Espérons que cela aide.OriginalL'auteur hughdbrown