我一直在寻找同样的东西。我知道 CherryPy 网站上有一些补丁。
我还在CherryPy SSL Client Authentication 找到了以下内容。我没有将它与 CherryPy 补丁进行比较,但也许这些信息会有所帮助。
我们最近需要开发一个快速的
但有弹性的 REST 应用程序和
发现 CherryPy 适合我们的需求
比其他 Python 网络更好
框架,例如 Twisted。
不幸的是,它的简单性缺乏
我们需要的关键功能,服务器/客户端
SSL 证书验证。所以
我们花了几个小时写了一些
快速修改当前
发布,3.1.2。以下代码
sn-ps 是我们的修改
制作:
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 的结构
pyOpenSSL 实现它是
很难找回客户
应用程序内的证书
堆栈。
当然上面的补丁应该
仅由您自担风险使用。如果你
请提出更好的解决方案
让我们知道。