8

Da CherryPy 3.0 in poi, a senso unico SSL può essere attivata semplicemente puntando al certificato del server e la chiave privata, in questo modo:2 vie SSL con 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()) 

Ciò consente ai clienti di convalidare la autenticità del server. Qualcuno sa se CherryPy supporta ssl a 2 vie, ad es. dove il server può anche verificare l'autenticità del client convalidando un certificato client?

Se sì, qualcuno potrebbe dare un esempio come è fatto? O pubblica un riferimento ad un esempio?

risposta

4

Non fuori dalla scatola. Dovresti applicare una patch a wsgiserver per fornire questa funzionalità. C'è un ticket (e patch) in corso al http://www.cherrypy.org/ticket/1001.

+2

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

3

Ho cercato la stessa cosa. So che ci sono alcune patch sul sito CherryPy.

Ho anche trovato il seguente a CherryPy SSL Client Authentication. Non ho confrontato questo vs le patch CherryPy ma forse le informazioni saranno utili.

Recentemente abbiamo bisogno di sviluppare un rapido ma elastica applicazione REST e scoperto che CherryPy adatto alle nostre esigenze meglio di altri Python rete quadri, come ritorto. Sfortunatamente, la sua semplicità mancava di una funzionalità chiave di cui avevamo bisogno, la convalida del certificato SSL Server/Client . Pertanto, abbiamo dedicato alcune ore alla scrittura di alcune modifiche rapide allo , 3.1.2. Il seguente codice frammenti sono le modifiche che abbiamo fatto :

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

Le precedenti patch richiedono l' inserimento di una nuova opzione di configurazione all'interno del server CherryPy configurazione, server.ssl_ca_certificate. L'opzione identifica il file di autorizzazione del certificato per la connessione dei client , se il client non presenta un certificato client valido chiuderà immediatamente la connessione .

nostra soluzione presenta vantaggi e svantaggi , il vantaggio principale essendo se il client di collegamento non fa presente un certificato valido è connessione verrà chiusa. Questo è utile per problemi di sicurezza come non consente al client alcun accesso allo stack dell'applicazione CherryPy. Tuttavia, poiché la limitazione viene eseguita a livello di socket, l'applicazione CherryPy non può mai vedere il client di connessione e quindi la soluzione non è flessibile.

Una soluzione ottimale permetterebbe il client collegare alla presa CherryPy e inviare il certificato client su nella pila applicazione.Quindi uno strumento CherryPy personalizzato convalida il certificato all'interno dello stack di applicazioni e chiude la connessione se necessario; sfortunatamente a causa della struttura dell'implementazione pyOpenSSL di CherryPy è difficile recuperare il certificato del client all'interno dello stack dell'applicazione.

Ovviamente i patch di cui sopra devono essere usati a solo a proprio rischio. Se rispondi a per una soluzione migliore, per favore, contattaci allo .

0

Se la versione corrente di CherryPy non supporta la verifica dei certificati client, è possibile configurare CherryPy per ascoltare 127.0.0.1:80, installare HAProxy ad ascoltare 443 e verificare i certificati lato client e per inoltrare il traffico a 127.0.0.1:80 HAProxy è semplice, leggero, veloce e affidabile. An example of HAProxy configuration

Problemi correlati