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