8

Od CherryPy 3,0 i dalej, jednokierunkowa SSL można włączyć po prostu poprzez wskazanie certyfikatu serwera i klucza prywatnego, tak:2-drożny SSL z CherryPy

import cherrypy 

class HelloWorld(object): 
    def index(self): 
     return "Hello SSL World!" 
    index.exposed = True 

cherrypy.server.ssl_certificate = "keys/server.crt" 
cherrypy.server.ssl_private_key = "keys/server.crtkey" 
cherrypy.quickstart(HelloWorld()) 

Umożliwia to klientom walidacji autentyczność serwera. Czy ktoś wie, czy CherryPy obsługuje 2-way ssl, np. gdzie serwer może również sprawdzić autentyczność klienta, sprawdzając certyfikat klienta?

Jeśli tak, czy ktoś mógłby dać przykład, jak to zrobić? Lub zamieścić odniesienie do przykładu?

Odpowiedz

4

To nie jest po wyjęciu z pudełka. Będziesz musiał załatać wsgiserver, aby zapewnić tę funkcję. Jest bilet (i łatki) w trakcie realizacji pod numerem http://www.cherrypy.org/ticket/1001.

+2

Teraz na https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate – Pim

3

Szukałem tego samego. Wiem, że na stronie CherryPy jest kilka poprawek.

Też znalazłem następujące na CherryPy SSL Client Authentication. Nie porównywałem tego z poprawkami CherryPy, ale może informacje będą pomocne.

Niedawno potrzebne do opracowania szybkiego ale sprężysty aplikacji REST i stwierdzili, że CherryPy dostosowane do naszych potrzeb lepiej niż inne Python sieci ram, jak skręcone. Niestety, jego prostocie brakowało kluczowej funkcji, potrzebnej, serwer/klient sprawdzanie poprawności certyfikatu SSL. Dlatego spędziliśmy kilka godzin pisząc kilka szybkich modyfikacji do bieżącego wydania , 3.1.2. Poniższe fragmenty kodu są modyfikacje my wykonane:

cherrypy/_cpserver.py 

@@ -55,7 +55,6 @@ instance = None ssl_certificate = None ssl_private_key 
= None 
+ ssl_ca_certificate = None nodelay = True 

def __init__(self): 

cherrypy/wsgiserver/__init__.py 

@@ -1480,6 +1480,7 @@ 
# Paths to certificate and private key files ssl_certificate = None ssl_private_key = None 
+ ssl_ca_certificate = None 

def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, max=-1, request_queue_size=5, timeout=10, shutdown_timeout=5): 

@@ -1619,7 +1620,9 @@ 

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if self.nodelay: self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
-  if self.ssl_certificate and self.ssl_private_key: 
+  if self.ssl_certificate and self.ssl_private_key and \ 
+   self.ssl_ca_certificate: 
+ if SSL is None: raise ImportError("You must install pyOpenSSL to use HTTPS.") 

@@ -1627,6 +1630,11 @@ ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.use_privatekey_file(self.ssl_private_key) ctx.use_certificate_file(self.ssl_certificate) 
+   x509 = crypto.load_certificate(crypto.FILETYPE_PEM, 
+    open(self.ssl_ca_certificate).read()) 
+   store = ctx.get_cert_store() 
+   store.add_cert(x509) 
+   ctx.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT, lambda *x:True) self.socket = SSLConnection(ctx, self.socket) self.populate_ssl_environ() 

Powyższe łatki wymagają włączenia nowej konfiguracji opcji wewnątrz serwera CherryPy konfiguracji server.ssl_ca_certificate. Ta opcja identyfikuje plik certyfikatu certyfikatu, który łączy klientów z walidacją, jeśli klient nie przedstawi ważnego klienta klienta , że natychmiast zamknie połączenie .

Nasze rozwiązanie ma swoje zalety i wady, Podstawową zaletą bycia jeśli klient łączący nie obecny ważny certyfikat to połączenie zostanie natychmiast zamknięty. Jest to dobre ze względów bezpieczeństwa, ponieważ nie umożliwia klientowi dostępu do aplikacji CherryPy w stosie CherryPy . Ponieważ jednak ograniczenie jest wykonywane na poziomie gniazda, aplikacja CherryPy nigdy nie widzi połączenia klienta, a zatem rozwiązanie jest nieco nieelastyczne.

Optymalne rozwiązanie umożliwi klientowi połączenie się z gniazdem CherryPy i przesłanie certyfikatu klienta do stosu aplikacji.Następnie niestandardowe narzędzie CherryPy może zweryfikować certyfikat wewnątrz stosu aplikacji i zamknąć połączenie , jeśli to konieczne; niestety ze względu na strukturę implementacji pyOpenSSL CherryPy jest trudny do uzyskania certyfikat klienta wewnątrz aplikacji stosu.

Oczywiście powyższe poprawki powinny być używane tylko na własne ryzyko. Jeśli masz wymyślić lepsze rozwiązanie, proszę daj nam znać.

0

Jeśli bieżąca wersja CherryPy nie obsługuje weryfikacji certyfikatu klienta, możliwe jest skonfigurowanie CherryPy słuchać 127.0.0.1:80 zainstalować HAProxy słuchać 443 i weryfikacji certyfikatów po stronie klienta i do przekazania ruchu 127.0.0.1:80 HAProxy jest proste, lekkie, szybkie i niezawodne. An example of HAProxy configuration