Двухсторонний SSL с CherryPy - PullRequest
       34

Двухсторонний SSL с CherryPy

8 голосов
/ 13 декабря 2010

Начиная с 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, например, где сервер также может проверять подлинность клиента, проверяя сертификат клиента?

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

Ответы [ 3 ]

4 голосов
/ 13 декабря 2010

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

3 голосов
/ 14 января 2011

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

Я также обнаружил следующее на CherryPy SSL Client Authentication . Я не сравнивал это с патчами CherryPy, но, возможно, информация будет полезна.

В последнее время нам нужно было разработать быстрый но устойчивое приложение REST и обнаружил, что CherryPy соответствует нашим потребностям лучше, чем другие сети Python рамки, как Twisted. К сожалению, его простота не хватало ключевая функция нам нужна, сервер / клиент Проверка 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.ssl_ca_certificate. это опция идентифицирует сертификат авторитетный файл, соединяющий клиентов будет проверен против, если клиент не представляет действительный клиент сертификат это закроет соединение немедленно.

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

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

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

0 голосов
/ 07 мая 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...