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