使用Twisted进行客户端证书身份验证的安全Websockets

时间:2013-05-15 11:59:16

标签: authentication websocket ssl-certificate 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视为不同的资源,之前没有进行过身份验证。

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

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

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

正如您所描述的那样,这只是一个浏览器错误,而且您使用Twisted可以做的事情并不多。

遗憾的是,Websockets仍然是一种有些不成熟的技术,而且你所看到的错误仍然存​​在。提交针对浏览器的错误并希望它们得到修复。

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