8

Von CherryPy 3,0 und weiter kann Einweg-SSL eingeschaltet werden einfach durch auf dem Serverzertifikat zeigt und einen privaten Schlüssel, wie folgt aus:2-Wege-SSL mit 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()) 

Dies ermöglicht den Kunden, die zu validieren Authentizität des Servers. Weiß jemand, ob CherryPy 2-Wege-SSL unterstützt, z. Wo kann der Server die Client-Authentizität auch durch Validierung eines Client-Zertifikats überprüfen?

Wenn ja, könnte jemand ein Beispiel geben, wie ist das gemacht? Oder einen Verweis auf ein Beispiel veröffentlichen?

Antwort

4

Es ist nicht out of the box. Sie müssten den wsgiserver patchen, um diese Funktion bereitzustellen. Es gibt ein Ticket (und Patches) bei http://www.cherrypy.org/ticket/1001.

+2

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

3

Ich habe nach der gleichen Sache gesucht. Ich weiß, dass es einige Patches auf der CherryPy-Site gibt.

Ich fand auch die folgenden bei CherryPy SSL Client Authentication. Ich habe dies nicht mit den CherryPy-Patches verglichen, aber die Informationen werden vielleicht hilfreich sein.

Wir haben vor kurzem eine schnelle aber robust REST-Anwendung zu entwickeln, die notwendig und festgestellt, dass CherryPy unsere Bedürfnisse besser als andere Python-Frameworks Vernetzung, wie Verdrehte. Leider mangelte es an seiner Einfachheit Schlüsselfeature, die wir benötigten, Server/Client SSL-Zertifikat-Validierung. Daher haben wir ein paar Stunden geschrieben ein paar schnelle Änderungen an der aktuellen Release, 3.1.2. Der folgende Code-Schnipsel sind die Modifikationen, die wir gemacht:

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() 

Das oben genannte Patches erfordert die Aufnahme einer neuen Konfiguration Option innerhalb des CherryPy Servers Konfiguration server.ssl_ca_certificate. Diese Option identifiziert das Zertifikat Authority-Datei, die Clients gegen validiert wird, wenn der Client kein gültiges Client Zertifikat zeigt, wird die Verbindung sofort geschlossen.

Unsere Lösung hat Vorteile und Nachteile , der primäre Vorteil wird, wenn der Client keine Verbindungs ​​ vorhanden ein gültiges Zertifikat es Verbindung wird sofort geschlossen. Dies ist gut für Sicherheitsbedenken wie es erlaubt dem Client keine Zugriff auf die CherryPy-Anwendung Stapel. Da jedoch die Beschränkung auf Socket-Ebene erfolgt, kann die CherryPy-Anwendung niemals die Clientverbindung sehen, und daher ist die Lösung etwas unflexibel.

Eine optimale Lösung würde der Client an die CherryPy Buchse und sendet, um das Client-Zertifikat nach oben in die Anwendungsstapel zu verbinden.Dann würde ein benutzerdefiniertes CherryPy-Tool das Zertifikat innerhalb des Application Stack validieren und die -Verbindung bei Bedarf schließen; leider wegen der Struktur von CherryPy pyOpenSSL Implementierung ist es schwierig, den Client Zertifikat innerhalb der Anwendung Stapel abrufen.

Natürlich sollten die obigen Patches nur auf eigene Gefahr verwendet werden. Wenn Sie mit einer besseren Lösung kommen bitte lassen Sie uns wissen.

0

Wenn die aktuelle Version von CherryPy nicht Client-Zertifikat Überprüfung unterstützen, ist es möglich, CherryPy konfigurieren zu hören HAProxy zu 127.0.0.1:80, installieren Sie auf 443 und überprüfen Client-Zertifikate und weiterleiten Verkehr zu hören 127.0.0.1:80 HAProxy ist einfach, leicht, schnell und zuverlässig. An example of HAProxy configuration