Я искал то же самое. Я знаю, что на сайте 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 это
трудно найти клиента
сертификат внутри приложения
стек.
Конечно, патчи выше должны
использовать только на свой страх и риск. если ты
придумайте лучшее решение, пожалуйста
дайте нам знать.