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ć.
Teraz na https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate – Pim