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.
Dlaczego musisz autoryzować w drugą stronę? Dopóki klient nie będzie nasłuchiwał połączeń, nie powinieneś też tego potrzebować. –
@ sshanshank124 Chciałbym uwierzytelnić każdego klienta na podstawie certyfikatu klienta i odpowiednio przetworzyć jego żądanie. – nishi
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/ –