8

De CherryPy 3.0 et au-delà, à sens unique SSL peut être activé simplement en pointant vers le certificat de serveur et la clé privée, comme ceci:2 voies SSL avec 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()) 

Cela permet aux clients de valider la l'authenticité du serveur. Est-ce que quelqu'un sait si CherryPy prend en charge SSL à deux voies, par exemple. où le serveur peut également vérifier l'authenticité du client en validant un certificat client?

Si oui, quelqu'un pourrait-il donner un exemple de comment cela se fait-il? Ou poster une référence à un exemple?

Répondre

4

Il n'est pas sorti de la boîte. Vous devrez patcher le wsgiserver pour fournir cette fonctionnalité. Il y a un ticket (et des correctifs) en cours au http://www.cherrypy.org/ticket/1001.

+2

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

3

J'ai cherché la même chose. Je sais qu'il y a quelques correctifs sur le site CherryPy. J'ai également trouvé ce qui suit à CherryPy SSL Client Authentication. Je n'ai pas comparé ceci aux correctifs de CherryPy mais peut-être l'information sera utile.

Nous avons récemment besoin de développer une application mais résilients rapide et REST constaté que CherryPy adapté à nos besoins mieux que d'autres Python réseau cadres, comme Twisted. Malheureusement, sa simplicité manquait une fonctionnalité clé nous avions besoin, Server/Client validation du certificat SSL. Par conséquent nous avons passé quelques heures à écrire quelques modifications rapides à la version actuelle , 3.1.2. Le code suivant extraits sont les modifications que nous faits:

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

Les patchs ci-dessus nécessitent l'inclusion d'une nouvelle option de configuration à l'intérieur de la configuration serveur CherryPy , server.ssl_ca_certificate. Cette option identifie le certificat si le client ne présente pas de certificat client valide .

Notre solution présente des avantages et des inconvénients , le principal avantage étant si le client de connexion ne présente un certificat valide sa connexion est fermée immédiatement. Ceci est bon pour des raisons de sécurité car il ne permet pas au client d'accéder à la pile de l'application CherryPy. Toutefois, étant donné que la restriction est effectuée au niveau de la socket, l'application CherryPy ne peut jamais voir le client se connecter et, par conséquent, la solution est quelque peu inflexible.

Une solution permettrait au client de se connecter à la prise CherryPy et envoyer le certificat client jusqu'à dans la pile d'applications.Ensuite, un outil personnalisé CherryPy validera le certificat à l'intérieur de la pile d'application et fermera la connexion si nécessaire; malheureusement en raison de la structure de pyOpenSSL mise en œuvre de CherryPy il est difficile de récupérer le certificat client à l'intérieur de l'application pile.

Bien entendu, les patchs ci-dessus ne doivent être utilisés qu'à vos risques et périls. Si vous trouver une meilleure solution s'il vous plaît laissez-nous savoir.

0

Si la version actuelle de CherryPy ne prend pas en charge la vérification du certificat client, il est possible de configurer CherryPy écouter 127.0.0.1:80, installer HAProxy écouter 443 et vérifier les certificats de côté client et de transmettre le trafic vers 127.0.0.1:80 HAProxy est simple, léger, rapide et fiable. An example of HAProxy configuration