Authentication 使用Twisted通过客户端证书身份验证保护WebSocket

Authentication 使用Twisted通过客户端证书身份验证保护WebSocket,authentication,websocket,ssl-certificate,twisted,Authentication,Websocket,Ssl Certificate,Twisted,我想知道是否有使用twisted实现安全WebSocket(wss://)和基于客户端证书的身份验证的选项 我按照上的说明进行了操作,其中描述了通过https://和客户端证书建立站点的过程。使用自签名证书,这种方法可以很好地工作。然而,当WebSocket开始发挥作用时,事情变得棘手起来 在IE 10中运行整个过程效果很好。客户端使用其证书进行身份验证,并获得对站点的访问权,并可以打开Websocket。不过,FF和Chrome不起作用。请注意,webserver和websocket在同一端口

我想知道是否有使用twisted实现安全WebSocket(wss://)和基于客户端证书的身份验证的选项

我按照上的说明进行了操作,其中描述了通过https://和客户端证书建立站点的过程。使用自签名证书,这种方法可以很好地工作。然而,当WebSocket开始发挥作用时,事情变得棘手起来

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

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

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


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

正如您所描述的,这只是一个浏览器错误,使用Twisted无法解决

令人遗憾的是,WebSocket仍然是一种不成熟的技术,像您看到的那样的bug仍在解决中。针对浏览器的文件错误,并希望它们得到修复


也许你可以考虑为非IE浏览器实现,假设客户机Curt Auth-Toes为该API /协议工作?

< P>对于所有有相同问题的感兴趣的读者,我终于明白了。 解决方案是为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。

谢谢您的提示。不过,我还是希望能找到解决办法。正如IE10所示,这个概念很好用,但是可靠性很低。解决方案是让浏览器修复bug。如果像你这样发现错误的人不报告错误,那么它们就不太可能被修复。所以,去报告他们,并链接到这里的错误报告,这样其他人可以找到他们,如果他们找到这个问题。我为这个问题提交了一个错误: