我想知道是否有选项可以实现安全的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视为不同的资源,之前没有进行过身份验证。
是否有人遇到过相同或稍微类似的问题,或者可能为此实施解决方案?
如果需要,我可以提供到目前为止的源代码。
答案 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 /协议?