Python żąda żądań.wyjątki.SSLError: [Errno 8] ssl.c: 504: EOF wystąpił z naruszeniem protokołu

Jestem na Ubuntu 12.10 z OpenSSL 1.0.1 c, python 2.7.3, żądania 1.0.3 i 1.0.4 (próbowałem obu), a podczas próby połączenia się ze stroną w zmiennej url z poniższym kodem.

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

Wyrzuca następujący błąd:

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

Próba połączenia z OpenSSL zwraca następujące wartości:

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

Jeśli zmuszę go do użycia tls1 to działa (wyjście okrojone):

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

Widziałem wiele raportów o błędach , jednak nie znalazłem sposób na obejście tego za pomocą biblioteki zapytań Pythona. Każda pomoc będzie bardzo mile widziana.

Author: Piotr Dobrogost, 2012-12-31

10 answers

Reposting this here for other from The requests issue page :

Requests ' nie obsługuje robienia tego przed wersją 1. Od wersji 1 oczekuje się, że podklasujesz HTTPAdapter, Tak:

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)

Kiedy to zrobisz, możesz to zrobić:

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

Każde żądanie za pośrednictwem tego obiektu sesji użyje TLSv1.

 43
Author: jasonamyers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 15:50:54

Ustawienie verify = False pomija tylko weryfikację certyfikatu serwera, ale nie pomoże rozwiązać błędów protokołu SSL.

Ten problem jest prawdopodobnie spowodowany wyłączeniem SSLv2 na serwerze WWW, ale Python 2.x próbuje domyślnie nawiązać połączenie z PROTOCOL_SSLv23. Dzieje się tak w https://github.com/python/cpython/blob/360aa60b2a36f5f6e9e20325efd8d472f7559b1e/Lib/ssl.py#L1057

Możesz łatać ssl.wrap_socket () w module ssl poprzez nadpisanie parametr słowa kluczowego ssl_version. Poniższy kod może być użyty jako-is. Umieść to na początku programu przed złożeniem jakichkolwiek wniosków.

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)
 34
Author: chnrxn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 16:34:33

Instalacja pakietu "security" dla requests rozwiązana dla mnie:

Sudo apt-get install libffi-dev

Sudo pip install-u requests[security]

 21
Author: Ricardo Cabral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 21:35:38

Jest to znany błąd, można go obejść za pomocą hacka:

Otwórz site-packages/requests/packages/urllib3/connectionpool.py (lub w inny sposób zrób lokalną kopię żądań wewnątrz własnego projektu) i Zmień blok, który mówi:

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)

Do:

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)

W przeciwnym razie, przypuszczam, że gdzieś jest obejście, które jest mniej hakerskie, ale nie mogłem znaleźć takiego z kilkoma spojrzeniami.

Uwaga: w notce bocznej, requests z PIP (1.0.4) na MacOS działa tylko z podanym adresem URL.

 5
Author: favoretti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-31 14:07:49

Napotkałem ten błąd i poprawka wydaje się wyłączać SNI, którego Python 2.7 nie obsługuje:

Http://bugs.python.org/issue5639

Urllib3 na Pythonie 2.7 błąd SNI na Google App Engine

 3
Author: Chris Pushbullet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59

Do ludzi, którzy nie mogą uzyskać ponad poprawki pracy.

Musiałem zmienić plik ssl.py żeby to naprawić. Poszukaj funkcji create_default_context i zmień linię:

context = SSLContext(PROTOCOL_SSLv23)

Do

context = SSLContext(PROTOCOL_TLSv1)

Może ktoś stworzy łatwiejsze rozwiązanie bez edycji ssl.py?

 3
Author: Zhack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 13:39:08

Miałem ten sam problem:

Raise SSLError (e)
prośby.wyjątki.SSLError: [Errno 8] _ssl.c: 504: EOF wystąpił z naruszeniem protokołu

Miałem fiddler uruchomiony, zatrzymałem fiddler capture i nie widziałem tego błędu. Może to przez fiddlera.

 2
Author: fd98279,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 15:51:15

Niestety zaakceptowana odpowiedź nie zadziałała dla mnie. Jako tymczasowe obejście można również użyć verify=False Podczas łączenia się z bezpieczną stroną internetową.

From Python Requests up SSLError

requests.get('https://example.com', verify=True)
 0
Author: bibstha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:22

Miałem ten błąd podczas łączenia się z serwerem RabbitMQ MQTT przez TLS. Jestem prawie pewien, że serwer jest uszkodzony, ale w każdym razie działał z OpenSSL 1.0.1, ale nie OpenSSL 1.0.2.

Możesz sprawdzić swoją wersję w Pythonie używając tego:

import ssl
ssl.OPENSSL_VERSION

Nie jestem pewien, jak obniżyć wersję OpenSSL w Pythonie (wydaje się, że jest statycznie połączony przynajmniej w Windows), poza używaniem starszej wersji Pythona.

 0
Author: Timmmm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 15:27:17

Miałem podobny problem i myślę, że jeśli po prostu zignorujemy weryfikację ssl zadziała jak u mnie. Więc łączenie się z serwerem za pomocą schematu https, ale kierowanie ich do nie weryfikowania certyfikatu.

Za pomocą requests. Wystarczy wspomnieć verify=False zamiast None

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

Nadzieję, że to zadziała dla tych, którzy potrzebują :).

 0
Author: MaNKuR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 07:36:43