He estado buscando lo mismo. Sé que hay algunos parches en el sitio CherryPy.
También encontré lo siguiente en CherryPy SSL Client Authentication. No he comparado esto con los parches CherryPy, pero tal vez la información sea útil.
recientemente Necesitábamos desarrollar una aplicación rápida pero resistente REST y encontramos que CherryPy adecuado para nuestras necesidades mejor que otras redes Python marcos, como Twisted. Desafortunadamente, su simplicidad carecía de una función clave que necesitábamos, Server/Client Validación del certificado SSL. Por lo tanto, pasamos unas horas escribiendo algunas modificaciones rápidas a la versión actual , 3.1.2. El siguiente código de fragmentos son las modificaciones que medida:
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()
Los parches anteriores requieren la inclusión de una nueva opción de configuración dentro del servidor CherryPy configuración , server.ssl_ca_certificate. Esta opción identifica el archivo de autoridad de certificación que clientes que se conectan serán validados contra, si el cliente no presenta un certificado válido cliente que cerrará la conexión inmediatamente.
Nuestra solución tiene sus ventajas y desventajas , la principal ventaja de ser si el cliente no lo hace la conexión presente un certificado válido Es conexión se cierra inmediatamente. Esto es bueno para problemas de seguridad como no permite al cliente ningún acceso en la aplicación CherryPy pila. Sin embargo, dado que la restricción se realiza a nivel de socket, la aplicación CherryPy nunca puede ver al cliente conectado y, por lo tanto, la solución es algo inflexible.
Una solución óptima sería permitir que el cliente para conectar a la toma de CherryPy y enviar el certificado de cliente arriba en la pila de aplicaciones.Entonces, una herramienta CherryPy personalizada validaría el certificado dentro de la pila de aplicaciones y cerraría la conexión si fuera necesario; lamentablemente debido a la estructura de la implementación de CherryPy pyOpenSSL es difícil de recuperar el cliente certificado dentro de la aplicación pila.
Por supuesto, los parches anteriores deben ser solo bajo su propio riesgo. Si usted presenta una mejor solución, por favor, comuníquenoslo al .
Ahora en https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate – Pim