3

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

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

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

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

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

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

4

2 回答 2

3

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

这应该这样做:

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。

于 2013-07-03T05:49:58.947 回答
1

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

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

也许您可以考虑为非 IE 浏览器实现服务器发送的事件,假设 client-cert-auth 的东西适用于该 API / 协议?

于 2013-05-20T18:09:44.420 回答