从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向SSL,例如服务器还可以通过验证客户端证书来检查客户端的真实性吗?

如果是,有人可以举个例子吗?还是发布一个示例的引用?

有帮助吗?

解决方案

它没有开箱即用。您必须修补WSGISERVER才能提供该功能。有一张票(和补丁)正在进行 http://www.cherrypy.org/ticket/1001.

其他提示

我一直在寻找同一件事。我知道樱桃网站上有一些补丁。

我还发现以下内容 Cherrypy SSL客户验证. 。我尚未将此与Cherrypy补丁进行比较,但可能会有所帮助。

最近,我们需要开发快速但有弹性的休息应用程序,发现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的Pyopenssl实现的结构,很难在应用程序堆栈内检索客户证书。

当然,上面的补丁只能自行使用。如果您提出更好的解决方案,请告诉我们。

如果Cherrypy的当前版本不支持客户证书验证,则可以配置Cherrypy收听127.0.0.0.1:80,安装Haproxy聆听443并验证客户端证书,并将流量转发至127.0.0.0.1:80 Haproxy Haproxy简单,轻巧,快速和可靠。Haproxy配置的示例

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top