【问题标题】:Secure Websockets with Client Certificate Authentication using Twisted使用 Twisted 通过客户端证书身份验证保护 Websocket
【发布时间】:2013-05-15 11:59:15
【问题描述】:

我想知道是否可以选择使用 twisted 实现安全 websockets (wss://) 和基于客户端证书的身份验证?

我按照http://twistedmatrix.com/documents/12.3.0/core/howto/ssl.html 上的说明进行操作,其中描述了通过 https:// 和客户端证书设置站点。使用自签名证书,这工作正常。然而,当 Websocket 发挥作用时,事情就变得棘手了。

在 IE 10 中运行整个程序运行良好。客户端使用他的证书进行身份验证并获得对站点的访问权限,并且可以打开 Websocket。但是,FF 和 Chrome 不起作用。注意 webserver 和 websocket 在同一个端口上运行。

在我看来,IE 似乎以某种方式存储了客户端的身份验证并将其用于访问 websocket。 FF 和 Chrome 以某种方式将 websocket 视为以前没有进行过身份验证的不同资源。

有没有人遇到过相同或类似的问题,或者可能为此实施了解决方案?

如果需要,我可以提供到目前为止的源代码。

【问题讨论】:

    标签: authentication websocket ssl-certificate twisted


    【解决方案1】:

    对于所有有同样问题的感兴趣的读者,我终于弄明白了。 解决方案是为 ssl 上下文设置会话 ID。然后浏览器似乎记住了证书身份验证,即使对于 websocket 之类的子资源也是如此。

    应该这样做:

    contextFactory = twisted.internet.ssl.DefaultOpenSSLContextFactory('keys/server.key',
                                                     'keys/server.crt')
    
    
    ctx = contextFactory.getContext()
    ctx.set_verify(
         OpenSSL.SSL.VERIFY_PEER | OpenSSL.SSL.VERIFY_CLIENT_ONCE,
         verifyCallback
         )
    ## Since we have self-signed certs we have to explicitly
    ## tell the server to trust them.
    ctx.load_verify_locations("keys/ca.crt")
    ctx.set_session_id("id")
    

    无论如何都需要第 1-8 行。新的是第 9 行。在这里你必须设置一个会话 id。

    【讨论】:

      【解决方案2】:

      正如您所描述的,这只是一个浏览器错误,您对 Twisted 无能为力。

      遗憾的是,Websockets 仍然是一种有些不成熟的技术,并且像您所看到的那样的错误仍在解决中。针对浏览器提交错误并希望它们得到修复。

      也许您可以考虑为非 IE 浏览器实现 server-sent events,假设 client-cert-auth 东西适用于该 API/协议?

      【讨论】:

      • 感谢您的提示。但是,我仍然希望是否有解决方案。正如 IE 10 所示,该概念运行良好,但缺乏可靠性
      • 解决方案是让浏览器修复错误。如果像你这样发现错误的人不报告它们,那么它们就不可能得到修复。所以,去报告他们,并在此处链接到错误报告,以便其他人在找到此问题时可以找到它们。
      • 我为此问题提交了一个错误:bugzilla.mozilla.org/show_bug.cgi?id=878715
      猜你喜欢
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2013-10-07
      • 1970-01-01
      • 2022-06-23
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多