Peticiones de Python requests.exceptions.SSLError:[Errno 8]_ssl.c: 504: EOF se produjo en violación del protocolo
openssl httprequest (10)
A las personas que no pueden superar las soluciones funcionando.
Tuve que cambiar el archivo ssl.py para arreglarlo. Busque la función create_default_context y cambie la línea:
context = SSLContext(PROTOCOL_SSLv23)
a
context = SSLContext(PROTOCOL_TLSv1)
Tal vez alguien puede crear una solución más fácil sin editar ssl.py?
Estoy en Ubuntu 12.10 con OpenSSL 1.0.1c, python 2.7.3, Requests 1.0.3 y 1.0.4 (probé ambas), y cuando intento conectarme al sitio web en la variable url con el siguiente código.
def SendInitialRequest(xmlmessage, redirecturl):
url = ''https://centineltest.cardinalcommerce.com/maps/txns.asp''
payload = ''cmpi_msg='' + ET.tostring(xmlmessage)
headers = {
''Content-Type'': ''application/x-www-form-urlencoded'',
}
r = requests.post(url, data=payload, headers=headers, verify=None)
print r.text
Lanza el siguiente error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "clams/libs/centinel/thinclient.py", line 134, in SendInitialRequest
r = requests.post(url, data=payload, headers=headers, verify=None)
File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/api.py", line 87, in post
return request(''post'', url, data=data, **kwargs)
File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/sessions.py", line 269, in request
resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies)
File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/sessions.py", line 364, in send
r = adapter.send(request, **kwargs)
File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/adapters.py", line 163, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol
Intentar la conexión con openssl devuelve lo siguiente:
$ openssl s_client -connect centineltest.cardinalcommerce.com:443
CONNECTED(00000003)
140019346777760:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 226 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
Si lo forzo a usar tls1, funciona (salida truncada):
$ openssl s_client -tls1 -connect centineltest.cardinalcommerce.com:443
CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU
verify error:num=20:unable to get local issuer certificate
verify return:0
---
He visto numerosos informes de errores para esto; Sin embargo, no he encontrado una forma de evitarlo utilizando la biblioteca de solicitudes de Python. Cualquier ayuda sería muy apreciada.
Estaba teniendo un problema similar y creo que si simplemente ignoramos la verificación de ssl
, funcionará como un hechizo, ya que funcionó para mí. Por lo tanto, conectarse al servidor con el esquema https
pero dirigiéndolos para que no verifiquen el certificado.
Usando requests
Solo mencione verify=False
lugar de None
requests.post(url, data=payload, headers=headers, verify=False)
Esperando que esto funcione para aquellos que necesitan :).
Este es un error conocido, puedes solucionarlo con un truco:
Abra site-packages/requests/packages/urllib3/connectionpool.py
(o simplemente haga una copia local de las solicitudes dentro de su propio proyecto), y cambie el bloque que dice:
def connect(self):
# Add certificate verification
sock = socket.create_connection((self.host, self.port), self.timeout)
# Wrap socket using verification with the root certs in
# trusted_root_certs
self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file,
cert_reqs=self.cert_reqs,
ca_certs=self.ca_certs,
server_hostname=self.host,
ssl_version=self.ssl_version)
a:
def connect(self):
# Add certificate verification
sock = socket.create_connection((self.host, self.port), self.timeout)
# Wrap socket using verification with the root certs in
# trusted_root_certs
self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file,
cert_reqs=self.cert_reqs,
ca_certs=self.ca_certs,
server_hostname=self.host,
ssl_version=ssl.PROTOCOL_TLSv1)
De lo contrario, supongo que hay una anulación en algún lugar que es menos hacky, pero no pude encontrar uno con algunas miradas.
NOTA : En una nota al margen, las requests
de PIP (1.0.4) en una MacOS solo funcionan con la URL que proporcionó.
He tenido este error al conectarme a un servidor RabbitMQ MQTT a través de TLS. Estoy bastante seguro de que el servidor está roto, pero de todos modos funcionó con OpenSSL 1.0.1, pero no con OpenSSL 1.0.2.
Puedes verificar tu versión en Python usando esto:
import ssl
ssl.OPENSSL_VERSION
No estoy seguro de cómo degradar OpenSSL dentro de Python (parece estar vinculado estáticamente en Windows al menos), aparte de usar una versión anterior de Python.
Instalar los extras del paquete de "seguridad" para las requests
resueltas para mí:
sudo apt-get install libffi-dev
sudo pip install -U solicita [seguridad]
La configuración de verificar = False solo omite la verificación del certificado del servidor, pero no ayudará a resolver los errores del protocolo SSL.
Es probable que este problema se deba a que SSLv2 está deshabilitado en el servidor web, pero Python 2.x intenta establecer una conexión con PROTOCOL_SSLv23 de forma predeterminada. Esto sucede en https://github.com/python/cpython/blob/360aa60b2a36f5f6e9e20325efd8d472f7559b1e/Lib/ssl.py#L1057
Puede aplicar el parche de mono a ssl.wrap_socket () en el módulo ssl anulando el parámetro de palabra clave ssl_version. El siguiente código se puede usar tal cual. Coloque esto al comienzo de su programa antes de realizar cualquier solicitud.
import ssl
from functools import wraps
def sslwrap(func):
@wraps(func)
def bar(*args, **kw):
kw[''ssl_version''] = ssl.PROTOCOL_TLSv1
return func(*args, **kw)
return bar
ssl.wrap_socket = sslwrap(ssl.wrap_socket)
Lamentablemente, la respuesta aceptada no funcionó para mí. Como solución temporal, también puede usar verify=False
cuando se conecta al sitio web seguro.
De Python Requests lanzando SSLError
requests.get(''https://example.com'', verify=True)
Me encontré con este error y parece que la solución está desactivando SNI, que Python 2.7 no admite:
Reposte esto aquí para otros desde la página de solicitud de problemas :
Las solicitudes "no permiten hacer esto antes de la versión 1. Después de la versión 1, se espera que subclassifique el HTTPAdapter, así:
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)
Cuando hayas hecho eso, puedes hacer esto:
import requests
s = requests.Session()
s.mount(''https://'', MyAdapter())
Cualquier solicitud a través de ese objeto de sesión usará TLSv1.
Tuve el mismo problema:
aumentar SSLError (e)
requests.exceptions.SSLError: [Errno 8] _ssl.c: 504: EOF se produjo en violación del protocolo
Hice funcionar el violinista, detuve la captura del violinista y no vi este error. Podría ser por el violinista.