2014-04-24 14 views
15

Wcześniej zaimplementowałem komunikację SSL, w której aplikacja kliencka weryfikuje tożsamość aplikacji serwera SSL za pomocą kolby. Teraz chcę, aby aplikacja serwera SSL zweryfikowała tożsamość aplikacji klienta SSL. Czy to możliwe w przypadku kolby? Jak zweryfikować certyfikat klienta? Podczas pierwszego uzgadniania klient wysyła CSR, a w odpowiedzi wysyłam certyfikat podpisany przez samocertyfikowany certyfikat CA.Dwukierunkowe uwierzytelnianie SSL dla kolby

Ale nie wiem jeszcze, w jaki sposób klient zostanie zweryfikowany przez serwer podczas następnej komunikacji. Czy jest jakieś wywołanie zwrotne dla weryfikacji certyfikatu. Link na Google groups mówi, że nie jest możliwe uwierzytelnianie ssl w Flask. w tym celu należy użyć serwera WWW, takiego jak Apache, ngnix. Czy to jedyny sposób na uwierzytelnienie klienta?

Jest jeszcze jedna rzecz, którą chcę osiągnąć, że muszę zidentyfikować każdego klienta na podstawie jego certyfikatu. jest to możliwe nawet z kolbą.

moje pytanie może być naiwni, nie jestem jeszcze bardzo znana kolba

+0

Dlaczego musisz autoryzować w drugą stronę? Dopóki klient nie będzie nasłuchiwał połączeń, nie powinieneś też tego potrzebować. –

+0

@ sshanshank124 Chciałbym uwierzytelnić każdego klienta na podstawie certyfikatu klienta i odpowiednio przetworzyć jego żądanie. – nishi

+2

TLS/SSL to funkcjonalność wchodząca w skład serwera WWW. Twoje pytanie sugeruje, że używasz serwera programistycznego Flasku zamiast serwera produkcyjnego do uruchomienia aplikacji. To chyba zły pomysł. Sprawdź http://flask.pocoo.org/docs/0.10/deploying/ –

Odpowiedz

6

Warunki

Zanim zacznę chciałbym zwrócić uwagę na komentarz @Emanuel EY. To, co chciałbyś rozważyć, gdyby zostało to zrobione najpierw na serwerze produkcyjnym lub programistycznym. Na przykład; jeśli używasz Apache WebServer, komponent HTTPS może być wykonany z Apache. Jedyną rzeczą, którą zrobiłbyś inaczej, jest przekazanie szczegółów certyfikatu jako opcji, a twoja aplikacja serwerowa zweryfikuje numer seryjny w samej aplikacji.

Możliwe jest

Ale tak to jest możliwe nie jest uważane za dobre praktyki programowania. Niestety, nie jest dostępny od flask.request i nie jest możliwy z pakietem Flask. Jednak Flask używa Werkzeug i jest to możliwe poprzez załatanie pakietu werkzeug.serving gdzie będzie zapisany twój główny kod Flask. Nie jest to zalecane, ponieważ możesz chcieć zaktualizować Flask lub Werkzeug później, a twoja łatka może się zepsuć i wymagać ponownego uwzględnienia. tj. od 0,9 do 1,0.

Zapewnia to rozwiązanie bez korzystania z serwera WWW. Ale poleciłbym kombinację serwera sieciowego/zmiennej środowiskowej. To czystsza i stosunkowo dobra praktyka.

Zrobiłem kilka testów, aby sprawdzić, czy jest to łatwe do wdrożenia. Udało mi się potwierdzić, że ta metoda może działać przy użyciu najnowszego kodu programowego "Werkzeug-0.10_devdev_20141223-py2.7".

Prawdopodobnie będziesz chciał sprawdzić numer seryjny (numer początkowy) znajdujący się w każdym certyfikacie (a może nawet niektóre inne zmienne). Jak być może wiesz, serial jest unikalny dla każdego certyfikatu i jest określany podczas procesu generowania certyfikatu przez ciebie po stronie serwera. Pomaga to zachować to razem z rekordami klientów i informacjami o certyfikatach (w razie potrzeby), aby później sprawdzić numer seryjny certyfikatu klienta. Uwaga: Może to wymagać zmian między wartością szesnastkową a dziesiętną dziesiętną.

Werkzeug dev_2014122

co zrobiłem było dodać w następujących opcjach na wezwanie do wrap_socket()werkzeug.serving.BaseWSGIServer.__init__.

Użyj tych; server_side=True, ca_certs= '/etc/apache2/ssl/ca.pem', cert_reqs=ssl.CERT_REQUIRED

  • ca_certs: Użyj tej weryfikacji przed, to jest cert CA wykorzystywane do generowania certyfikatów klienta)
  • ssl.CERT_REQUIRED: wymagają weryfikacji certyfikatu klienta przed ca_certs

Uwaga: Jeśli certyfikat klienta nie przejdzie weryfikacji początkowej, nie będzie można pobrać certyfikatu klienta. To będzie Brak.

Wtedy w mojej klasie testowej Kolba I połatany verify_request gdzie

def verify_request(self, request, client_address): 

cert = request.getpeercert(True) 
raw = decoder.decode(cert)[0] 
print "Serial Number of your certificate is: % " % str(raw[0][1]) 
# todo: do checks & if serial no is ok then return true 
return True 

werkzeug.serving.BaseWSGIServer.verify_request = verify_request 

ten udowodnił, że jest to możliwe, ale prawdopodobnie będziesz chciał do zbadania teleskopowe wniosek klasy HTTPServer że BaseWSGIServer dziedziczy znaleźć lepszy sposób na oddzwonienie lub nadpisanie.

Werkzeug 0.9.x

Jeśli używasz Werkzeug 0.9.x Jestem zakładając używasz import from OpenSSL import SSL. zobacz fragment kodu: here. Nie testowałem tego.

Niektóre z połączeń, które mogą Cię zainteresować w tej wersji, będą następujące; - Context.set_verify(mode, callback) - Connection.get_peer_certificate()

Wyjaśnienie

Co ja nie rozumiem, to odniesienie do ciągu pierwszego uścisku wysyłając CSR. Jeśli jest to proces generowania certyfikatu klienta, warto przemyśleć, jak to zrobić w kontekście systemu i środowiska. Gdybym mógł mieć więcej informacji, mógłbym dalej komentować.

Również "uzgadnianie" w kontekście SSL/TLS ogólnie odnosi się do akcji tworzenia bezpiecznego połączenia w pierwszej kolejności przy użyciu istniejącego certyfikatu. Natychmiast po uzgadnianiu się, luźno mówiąc, nawiązuje się połączenie.

+0

Jak uzyskać dostęp do obiektu Connection? Czy jest to dostępne z obiektu żądania kolby? –

+0

Przetestowałem patch małpy na dowód koncepcji i zredagowałem odpowiedź. To nie jest dobra praktyka, ale pokazuje, że jest to możliwe, JEŚLI POTRZEBUJESZ. Proszę zauważyć różnice Werkzeug 0.9 i 1.0 z pakietem SSL. – Ross

+0

Dzięki za odpowiedź. Chciałbym to powtórzyć i sprawdzić, czy to działa w moim przypadku – nishi

Powiązane problemy