【问题标题】:2-way SSL with CherryPy使用 CherryPy 的 2 路 SSL
【发布时间】:2011-05-24 13:49:44
【问题描述】:

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

如果是,谁能举例说明这是如何做到的?或者发布对示例的引用?

【问题讨论】:

    标签: ssl certificate ssl-certificate cherrypy client-certificates


    【解决方案1】:

    它不是开箱即用的。您必须修补 wsgiserver 以提供该功能。 http://www.cherrypy.org/ticket/1001 正在处理票证(和补丁)。

    【解决方案2】:

    我一直在寻找同样的东西。我知道 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 实现它是 很难找回客户 应用程序内的证书 堆栈。

    当然上面的补丁应该 仅由您自担风险使用。如果你 请提出更好的解决方案 让我们知道。

    【讨论】:

      【解决方案3】:

      如果当前版本的 CherryPy 不支持客户端证书验证,可以配置 CherryPy 监听 127.0.0.1:80,安装 HAProxy 监听 443 并验证客户端证书并将流量转发到 127.0.0.1 :80 HAProxy 简单、轻便、快速且可靠。 An example of HAProxy configuration

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 2013-06-20
        • 2015-01-17
        • 2015-06-23
        相关资源
        最近更新 更多