Вопрос

Из Cherrypy 3.0 и далее одностороннее SSL можно включить, просто, указывая на сертификат сервера и закрытый ключ, как это:

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

Это позволяет клиентам подтвердить подлинность сервера. Кто-нибудь знает, поддерживает ли Cherrypy 2-Way SSL, например, где сервер также может проверить подлинность клиента, проверяя сертификат клиента?

Если да, может ли кто-нибудь привести пример, как это сделано? Или опубликовать ссылку на пример?

Это было полезно?

Решение

Это не из коробки. Вам придется исправить WSGISERVER, чтобы обеспечить эту функцию. Есть билет (и патчи) в процессе http://www.cherrypy.org/ticket/1001..

Другие советы

Я искал то же самое. Я знаю, что на сайте Cherrypy есть несколько патчей.

Я также нашел следующее в Creberpy SSL Клиент Аутентификация. Отказ Я не сравнил это против вишневых патчей, но, возможно, информация будет полезна.

Недавно мы должны были разработать быстрое, но устойчивое приложение для отдыха и обнаружили, что Cherrypy подходит для наших потребностей лучше, чем другие структуры сети Python, такие как скрученные. К сожалению, его простота не хватало ключевой функции, которую нам нужна, проверка сертификата SSL сервера / клиента. Поэтому мы провели несколько часов, написав несколько быстрых модификаций текущей выпуске, 3.1.2. Следующие фрагменты кода являются модификациями, которые мы сделали:

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

Приведенные выше патчки требуют включения новой опции конфигурации внутри конфигурации Cherrypy Server, Server.SSL_CA_CERTICATE. Эта опция идентифицирует файл власти сертификата, который соединяет клиенты, будет подтвержден, если клиент не представляет действующий клиентский сертификат, он немедленно закроет соединение.

Наше решение имеет преимущества и недостатки, первичное преимущество, если бы соединительный клиент не представляет собой действительный сертификат, это соединение, которое он немедленно закрыт. Это хорошо для проблем безопасности, поскольку она не позволяет клиенту любой доступ в стек приложений Cherrypy. Однако, поскольку ограничение осуществляется на уровне сокета, приложение Cherrypy никогда не сможет увидеть, как клиент подключился и, следовательно, раствор несколько негибко.

Оптимальное решение позволит клиенту подключаться к розетке Cherrypy и отправлять клиентский сертификат в комплекс приложений. Затем пользовательский инструмент CherryPy будет подтвердить сертификат внутри стека приложения и закрыть соединение при необходимости; К сожалению, из-за структуры реализации Cherrypy's Pyopenssl требуется затруднительным восстановлению клиентского сертификата внутри стека приложения.

Конечно, патчи выше следует использовать только на свой страх на свой собственный риск. Если вы придумаете лучшее решение, пожалуйста, дайте нам знать.

Если текущая версия Cherrypy не поддерживает проверку клиентских сертификатов, можно настроить CherryPy для прослушивания 127.0.0.1:80, установите HAProxy, чтобы прослушать 443 и проверить сертификаты на стороне клиента и пересылать трафик на 127.0.0.1:80 haproxy прост, легкий, быстрый и надежный.Пример конфигурации haproxy

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top