Питон запросов.исключения.SSLError: [Errno 8] ssl.c: 504: EOF произошло в нарушение протокола



Я на Ubuntu 12.10 с OpenSSL 1.0.1 c, python 2.7.3,запросы 1.0.3 и 1.0.4 (пробовали оба), а при попытке подключиться к веб-сайту в переменной url со следующим кодом.



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


Он выдает следующую ошибку:



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


попытка соединения с openssl возвращает следующее:



$ 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
---


если я заставлю его использовать tls1 он работает (выход усечен):



$ 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
---


Я видел много отчеты об ошибках для этого; однако, я не нашел способ обойти его с помощью библиотеки запросов python. Любая помощь будет весьма признательна.

816   10  

10 ответов:

репост это здесь для других от страница выдачи запросов:

запросы ' не поддерживает делать это до версии 1. После версии 1, Вы должны создать подкласс для HTTPAdapter, вот так:

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)

когда вы сделали это, вы можете сделать это:

import requests
s = requests.Session()
s.mount('https://', MyAdapter())

любой запрос через этот объект сеанса будет использовать TLSv1.

параметр verify=False пропускает только проверку сертификата сервера, но не помогает устранить ошибки протокола SSL.

эта проблема, вероятно, из-за SSLv2 отключается на веб-сервере, но Python 2.x пытается установить соединение с PROTOCOL_SSLv23 по умолчанию. Это происходит по адресу https://github.com/python/cpython/blob/360aa60b2a36f5f6e9e20325efd8d472f7559b1e/Lib/ssl.py#L1057

вы можете обезьяна патч SSL.wrap_socket() в модуле ssl по переопределение параметра ключевого слова ssl_version. Следующий код может быть использован как есть. Положите это в начале вашей программы, прежде чем делать какие-либо просьбы.

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)

установка дополнительного пакета "безопасность" для requests решена для меня:

sudo apt-get install libffi-dev

sudo pip install-U requests[security]

это известная ошибка, вы можете обойти ее с помощью Хака:

открыть site-packages/requests/packages/urllib3/connectionpool.py (или иначе просто сделайте локальную копию запросов внутри вашего собственного проекта) и измените блок, который говорит:

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)

to:

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)

в противном случае, я полагаю, что где-то есть переопределение, которое менее хакерское, но я не мог найти его с несколькими взглядами.

Примечание: замечание, requests из PIP (1.0.4) на MacOS просто работает с URL вы предоставили.

Я столкнулся с этой ошибкой, и исправление, похоже, отключает SNI, который Python 2.7 не поддерживает:

http://bugs.python.org/issue5639

urllib3 на python 2.7 SNI ошибка на Google App Engine

для людей, которые не могут получить выше исправлений работает.

пришлось изменить файл ssl.py чтобы исправить это. Найдите функцию create_default_context и измените строку:

context = SSLContext(PROTOCOL_SSLv23)

до

context = SSLContext(PROTOCOL_TLSv1)

может быть, кто-то может создать более простое решение без редактирования ssl.py?

У меня была такая же проблема:

поднять SSLError (e)
запросы.исключения.SSLError: [Errno 8] _ssl.c: 504: EOF произошло в нарушение протокола

У меня был fiddler работает, я остановил fiddler capture и не видел эту ошибку. Может быть из-за скрипача.

к сожалению, принятый ответ не работа для меня. В качестве временного обходного пути вы также можете использовать verify=False при подключении к защищенному сайту.

С запросы Python выбрасывают SSLError

requests.get('https://example.com', verify=True)

У меня была эта ошибка при подключении к серверу RabbitMQ MQTT через TLS. Я уверен, что сервер сломан, но в любом случае он работал с OpenSSL 1.0.1, но не OpenSSL 1.0.2.

вы можете проверить свою версию в Python, используя это:

import ssl
ssl.OPENSSL_VERSION

Я не уверен, как понизить OpenSSL в Python (кажется, он статически связан с Windows, по крайней мере), кроме использования более старой версии Python.

у меня была аналогичная проблема и я думаю, что если мы просто игнорировать ssl проверка будет работать как шарм, как это работало для меня. Так что подключение к серверу с https схема, но направляя их не для проверки сертификата.

используя requests. Просто упомяните verify=False вместо None

    requests.post(url, data=payload, headers=headers, verify=False)

надеялся, что это будет работать для тех, кто нуждается :).

Comments

    Ничего не найдено.