8

De CherryPy 3.0 y en adelante, de una sola vía SSL se puede activar simplemente apuntando hacia el certificado del servidor y la clave privada, así:2 vías 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()) 

Esto permite a los clientes para validar la autenticidad del servidor ¿Alguien sabe si CherryPy admite ssl bidireccional, p. donde el servidor también puede verificar la autenticidad del cliente al validar un certificado del cliente?

En caso afirmativo, ¿podría alguien dar un ejemplo de cómo se hace? ¿O publicar una referencia a un ejemplo?

Respuesta

4

No sale de la caja. Tendría que parchear el wsgiserver para proporcionar esa característica. Hay un ticket (y parches) en progreso en el http://www.cherrypy.org/ticket/1001.

+2

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

3

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 .

0

Si la versión actual de CherryPy no admite la verificación de certificados de cliente, es posible configurar CherryPy escuchar 127.0.0.1:80, instale HAProxy para escuchar a 443 y verificar los certificados del lado del cliente y para reenviar el tráfico a 127.0.0.1:80 HAProxy es simple, ligero, rápido y confiable. An example of HAProxy configuration