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