2012-12-04 19 views
10

Dzisiaj stanąłem przed jedną interesującą kwestią.Błąd Httplib2 ssl

Używam foursquare zalecanych biblioteki Pythona httplib2 podnieść

SSLHandshakeError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed'),) 

podczas próby zażądać tokenu OAuth

response, body = h.request(url, method, headers=headers, body=data) 

w

_process_request_with_httplib2 function 

czy ktoś wie dlaczego tak się dzieje ?

+3

Jestem całkiem pewien, że weryfikacja certyfikatu SSL nie powiodło **: - D ** – BorrajaX

Odpowiedz

20

Jeśli wiesz, że strona, którą próbujesz uzyskać to „dobry człowiek”, można spróbować stworzyć swój „otwieracz” tak:

import httplib2 
if __name__ == "__main__": 
    h = httplib2.Http(".cache", disable_ssl_certificate_validation=True) 
    resp, content = h.request("https://site/whose/certificate/is/bad/", "GET") 

(ciekawe jest to disable_ssl_certificate_validation=True)

Od docs: http://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http

EDIT 01:

Skoro twoje pytanie brzmiało: dlaczego tak się dzieje, możesz sprawdzić: this lub this.

EDIT 02:

Widząc jak ta odpowiedź została odwiedzona przez więcej osób niż się spodziewałem, chciałbym wyjaśnić nieco gdy wyłączenie sprawdzania poprawności certyfikatu może być przydatna.

Po pierwsze, trochę jasnego tła na temat działania tych certyfikatów. W linkach podanych powyżej jest sporo informacji, ale i tak jest.

Certyfikaty SSL muszą być zweryfikowane przez dobrze znaną (przynajmniej dobrze znaną przeglądarce) Certificate Authority. Zazwyczaj kupić cały certyfikat od jednego z tych organów (Symantec, GoDaddy ...)

Najogólniej mówiąc, chodzi o to: Te urzędy certyfikacji (CA), daje świadectwo, że zawiera również informacje w nim CA . Przeglądarki mają listę dobrze znanych urzędów certyfikacji, więc gdy przeglądarka otrzyma certyfikat, zrobi ona coś w rodzaju: "HmmmMMMmmm .... [przeglądarka przedstawia tutaj niezwykłą twarz]... Otrzymałem certyfikat i jest napisane, że został zweryfikowany przez firmę Symantec Czy znam tego gościa "Symantec"? [przeglądarka przechodzi następnie na listę znanych urzędów certyfikacji i sprawdza wersję Symantec]Oh, yeah! I do. Ok, the certyfikat jest dobry!

Można zobaczyć, że informacja się po kliknięciu na małym zamkiem przez URL w przeglądarce:

Chrome certificate information

Jednakże istnieją przypadki, w których po prostu chcesz przetestować HTTPS i tworzysz własny ośrodek certyfikacji, używając kilku narzędzi command line i używasz tego "niestandardowego" ośrodka CA do podpisywania właśnie wygenerowanego "niestandardowego" certyfikatu, prawda? W takim przypadku Twoja przeglądarka (która, nawiasem mówiąc, w pytaniu to: httplib2.Http) nie będzie miała twojego "niestandardowego" CA wśród listy zaufanych urzędów certyfikacji, więc powie, że certyfikat jest nieprawidłowy. Informacje będą nadal szyfrowane, ale to, co mówi nam przeglądarka, to to, że nie wierzy w to, że podróżuje zaszyfrowana do miejsca, do którego przypuszcza.

Na przykład, powiedzmy, że stworzyliśmy zestaw niestandardowych klawiszy i urzędów oraz wszystkich mambo-jumbo następujące this tutorial dla localhostFQDN i że plik certyfikatu CA znajduje się w bieżącym katalogu. Można bardzo dobrze mieć serwer uruchomiony na https://localhost:4443 przy użyciu niestandardowych certyfikatów i czegokolwiek. Teraz plik certyfikatu CA znajduje się w bieżącym katalogu, w pliku ./ca.crt (w tym samym katalogu, w którym będzie uruchomiony skrypt Pythona). Można użyć tak:

h = httplib2.Http(ca_certs='./ca.crt') 
response, body = h.request('https://localhost:4443') 
print(response) 
print(body) 

... i nie można zobaczyć ostrzeżenie więcej. Czemu? Ponieważ powiedziano iść szukać certyfikatu CA jest ./ca.crt)

Jednakże, ponieważ Chrome (cytować przeglądarki) nie wie o certyfikacie tym CA, rozważy to nieważne:

enter image description here

Również certyfikaty wygasają. Istnieje szansa, że ​​pracujesz w firmie, która używa witryny wewnętrznej z szyfrowaniem SSL. Działa dobrze przez rok, a potem twoja przeglądarka zaczyna narzekać. Idziesz do osoby, która jest odpowiedzialna za bezpieczeństwo i pytasz: "Yo !! Dostaję to ostrzeżenie tutaj! Co się dzieje?" Odpowiedź brzmi równie dobrze: "Och, chłopcze, zapomniałem odnowić certyfikat! Jest ok, po prostu zaakceptuj to od teraz, aż to naprawię". (true story, chociaż były przekleństwa w odpowiedzi otrzymałem :-D)

+3

To naprawdę nie jest świetny pomysł - powinieneś naprawdę dowiedzieć się, dlaczego twoja walidacja zawodzi. Przez wyłączenie sprawdzania poprawności, w zasadzie usuniesz możliwość wykrywania wielu ataków typu "człowiek w środku", w których ktoś chce podszyć się pod serwer Foursquare - nie będziesz w stanie wykryć nawet prostego przypadku, w którym wygenerował samopodpisany certyfikat. – javanix

+1

Uwaga: do wyłączenia sprawdzania poprawności certyfikatu wymagane jest tylko 'h = httplib2.Http (disable_ssl_certificate_validation = True). –

+0

@javanix, stąd * Jeśli wiesz, że strona, którą próbujesz zdobyć, jest "dobrym facetem" ... * – BorrajaX

10

ostatnich wersjach httplib2 jest zalegających do własnego magazynu certyfikatów.

# Default CA certificates file bundled with httplib2. 
CA_CERTS = os.path.join(
    os.path.dirname(os.path.abspath(__file__)), "cacerts.txt") 

W przypadku jeśli używasz ubuntu/debian, można jawnie przekazać ścieżkę do pliku certyfikatu systemu jak

httplib2.HTTPSConnectionWithTimeout(HOST, ca_certs="/etc/ssl/certs/ca-certificates.crt")