2013-09-02 32 views
56

używam żądania do komunikowania się z aplikacji django aleużyciu żądania z TLS nie daje Sni Wsparcie

Kiedy próbuję

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

pojawia się błąd:

hostname 'mysite.com' doesn't match either of '*.myhost.com', 'myhost.com'

Jednak gdy patrzę na przeglądarkę lub http://www.digicert.com/help/, certyfikat wygląda dobrze i elegancko.

Mój gospodarz zasugerował, że to brak wsparcia SNI z żądań (i Github wydaje się potwierdzać, że https://github.com/kennethreitz/requests/issues/749). Czy ktoś znalazł sposób na obejście żądania?

+0

edytowany Lukasa odpowiedzi (prawidłowa) na obejście mieć wsparcie SNI u starszych Żądania w przypadku, gdy nie możesz używać najnowszej wersji Github Upewnij się, że masz zainstalowane odpowiednie zależności (nie tylko pythonowe, również openssl), które będą dostępne po przejrzeniu edycji :) – AntonioMO

+0

Myślę, że to lepiej stworzyć nową odpowiedź niż wykonać redical e dit w poście kogoś –

+0

Cóż, jego odpowiedź jest poprawna, więc pomyślałem, że nie jest miło mieć kolejną odpowiedź na inną sprawę, osobiście naprawdę wolę jedną odpowiedź mającą wszystkie informacje. Ale opublikuję kolejną odpowiedź. – AntonioMO

Odpowiedz

116

Obecna wersja Żądań powinna być w porządku z SNI. Further down the GitHub issue widać wymagania:

Spróbuj zainstalować te pakiety, a następnie dać im kolejną szansę.

EDYTOWANIE: Od żądań v2.12.1, ndg-httpsclient i pyasn1 nie są już wymagane. Pełną listę wymaganych pakietów jest teraz:

  • pyOpenSSL
  • IDNA
+3

Dziękuję. Widziałem także to żądanie ściągania https://github.com/kennethreitz/requests/pull/1347 , które wraz z instalacją urllib3, ndg-httpsclient i pyasn1 rozwiązało to. – Massagran

+0

Błąd wspomniany przez @qarma jest śledzony przez [wydanie 1732] (https://github.com/kennethreitz/requests/issues/1732) i jest już naprawiony w master. – Lukasa

+4

Czy ta poprawka nadal działa? Otrzymuję komunikat "[Errno bad handshake] [(" Procedury SSL "," SSL3_GET_SERVER_CERTIFICATE "," certyfikat nie weryfikuje nie powiodło się ")]' '. – Roman

4

@Lukasa odpowiedź jest poprawna z teraźniejszością (od GitHub) wniosków. Pamiętaj, aby dodać OpenSSL do swojego systemu również poza wymienionymi zależnościami pip.

Jeśli z powodów wdrażania wolisz wersję stabilną wnioski jak w 1.2.3 w pip można małpa łata, że ​​jeden do pracy z SNI tak:

import requests 


def fileno(self): 
    return self.socket.fileno() 


def close(self): 
    return self.connection.shutdown() 


requests.pyopenssl.WrappedSocket.close = close 
requests.pyopenssl.WrappedSocket.fileno = fileno 
22

W porządku dla mnie, aby uzyskać akceptowane odpowiedzi do pracy, musiałem zainstalować kilka innych pakietów, w tej kolejności:

  • yum install libffi-devel
  • yum install gcc
  • yum install otwiera sl-devel
  • pip zainstalować urllib3
  • pip zainstalować pyopenssl
  • pip zainstalować NDG-httpsclient
  • pip zainstalować pyasn1
+2

Musiałem również zainstalować: yum zainstalować python-devel przed przejściem do instalacji pip .. – Kaos

+0

Właściwie dla mnie ndg-httpsclient zainstalował wszystkie te pakiety Pythona oprócz urllib3. Uwaga, aby uzyskać najnowszą wersję PIP, lub nie będzie działać jak ... – Kaos

+0

Dlaczego tak wiele instalacji potrzebne - tylko do użytkownika 'request()'? – ihue

6

lub można po prostu użyć Python 2.7.9 i up:

"Cały moduł ssl Pythona 3.4 został przeniesiony do Pythona 2.7.9. Zobacz uzasadnienie PEP 466."

https://www.python.org/downloads/release/python-279/

+3

Ciągle otrzymuję 'requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] niepowodzenie uśpienia alertu sslv3 (_ssl.c: 590)' i mam 'Python 2.7.10' – ihue

8

zainstalować moduł pyta jak to. Będzie to zainstalować dodatki pakiet bezpieczeństwa.

pip install requests[security]

+1

update pip przed wykonaniem powyższego polecenia. – xialu

Powiązane problemy