python openssl httprequest python-requests ubuntu-12.10

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)



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.