Pregunta

A partir 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í:

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 soporta SSL de 2 vías, por ejemplo, donde el servidor también puede comprobar la autenticidad del cliente mediante la validación de un certificado de cliente?

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

¿Fue útil?

Solución

No hace fuera de la caja. Habría que parchear el wsgiserver para proporcionar dicha función. Hay un billete (y parches) en curso en http://www.cherrypy.org/ticket/1001 .

Otros consejos

He estado buscando la misma cosa. Sé que hay algunos parches en el sitio CherryPy.

También se encontró lo siguiente en autenticación de cliente SSL CherryPy . No he comparado este vs los parches CherryPy pero tal vez la información será útil.

Recientemente necesaria para desarrollar una rápida pero REST elástico aplicación y encontrado que CherryPy adecuado para nuestras necesidades mejor que otras redes Python marcos, como retorcido. Por desgracia, su simplicidad carecía de una característica clave que necesitábamos, servidor / cliente la validación del certificado SSL. Por lo tanto pasamos un par de horas a escribir unas pocas modificaciones rápidas a la corriente liberar, 3.1.2. El siguiente código fragmentos son las modificaciones que hecho:

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 configuración opción dentro del servidor CherryPy configuración, server.ssl_ca_certificate. Esta opción identifica el certificado archivo de autoridad de que clientes que se conectan será validado en contra, si el el cliente no presenta un cliente válido certificado se va a cerrar la conexión inmediatamente.

Nuestra solución tiene ventajas y desventajas, la principal ventaja siendo si el cliente que se conecta no lo hace presentar un certificado válido que es conexión se cierra inmediatamente. Esto es bueno para los problemas de seguridad como que no permite que el cliente cualquier el acceso a la aplicación CherryPy apilar. Sin embargo, dado que la restricción se realiza en el nivel de socket CherryPy aplicación nunca puede ver el cliente que se conecta y por tanto la solución es algo inflexible.

Una solución óptima sería permitir que el cliente se conecte a la CherryPy socket y envíe el certificado de cliente arriba en la pila de aplicaciones. Entonces un Herramienta CherryPy encargo validaría el interior del certificado pila de aplicaciones y cerca de la conexión si fuera necesario; Desafortunadamente debido a la estructura de CherryPy de pyOpenSSL aplicación es difícil de recuperar el cliente certificado en el interior de la solicitud pila.

Por supuesto, los parches anteriores deben sólo se puede utilizar a su propio riesgo. Si tu llegar a una solución mejor por favor háganoslo saber.

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 fiable. Un ejemplo de HAProxy configuración

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top