WebSocket身份验证安全

17

我正在尝试为注册会员区域将客户端身份验证到我的安全WebSocket服务器(wss)。

一旦会员连接到Web服务器,我在数据库中记录一个唯一的令牌(与该会员相关联),并在发起与Web Socket服务器的连接的页面上显示它的隐藏字段。

然后,将令牌发送到WebSocket服务器,WebSocket服务器使用令牌进行身份验证。

我不是真正的安全专家,并希望听取您对我的身份验证安全性的意见。

除了cookie劫持之外,是否存在任何风险?是否有更好的方法来处理考虑到WebSocket在握手期间没有规定服务器可以验证客户端的特定方式。

我使用Ratchet WebSocket。


请参阅Websocket身份验证。我认为这不是重复问题,因为它询问的是WebSocket中的HTTP登录。 - jww
令牌中包含什么?大多数会话/身份验证令牌都具有某种时间限制机制(以减轻泄漏的影响),并且可能具有一种机制,使用户可以使旧令牌无效(例如在更改密码时)。您的令牌是否包括签名过期时间,或者作为具有类似属性的服务器端状态存储的密钥? - bobince
SocketCluster最初使用cookie来存储JWT令牌,但现在已经不再使用。您可以在此处阅读原因:https://github.com/SocketCluster/socketcluster-client/issues/9 - Jon
2个回答

8

是的,一种选择是使用cookie(和TLS以避免cookie劫持):

在“普通HTML表单登录”后设置cookie,将cookie传输到WebSocket服务器,并使用cookie对WebSocket进行验证。

这里有一个完整示例,展示了如何使用Mozilla Persona进行WebSocket身份验证。

您问到了Ratchet。虽然这个示例不是Ratchet,但它可能会给您一些线索,这就是为什么我认为可以指向它的原因。


-7

有风险吗?

是的,有很多。PKI/PKIX和SSL/TLS存在许多架构缺陷。有关完整的处理,请参见Peter Gutmann的Engineering Security

此外,WebSockets不允许您查询底层连接的属性。因此,据我所知,您甚至无法确定是否实际上正在使用SSL/TLS。您唯一知道的是您请求了它。


有没有更好的方法来处理WebSocket呢?
我上次检查时,WebSockets非常糟糕。你只能做到打开、读取和写入。它们旨在易于使用,但缺乏与安全相关的任何有用功能。

为了完整性,我上次检查是在2013年3月,当时我对使用它们的应用程序进行了安全评估。现在可能已经有所改变。

我还尝试联系WebSockect RFC作者和RFC编辑,就一些安全问题进行了沟通。但所有的邮件都没有得到回复。


更新(2015年):情况变得更好了……浏览器和其他用户代理现在支持主机公钥固定

但是,如果你仔细看细节,它应该被称为“带有覆盖的主机公钥固定”。内置的覆盖允许攻击者破坏良好的固定集。更糟糕的是,浏览器在掩盖中起到了共谋作用,因为它必须抑制失败的固定报告。

您可以在draft-ietf-websec-key-pinning的评论中阅读更多关于它的投诉(以及反驳)。

这是一个不应该被标准化的垃圾标准。它只是更不安全的浏览器垃圾。


1
需要区分WebSocket协议(RFC6455)和浏览器中的W3C WebSocket API。在浏览器中运行的JavaScript无法检索安全连接上的证书,而这与使用WebSocket、AJAX或其他内容无关。这是按设计来实现的。否则,在Intranet上运行的恶意JS可能会在网络上“探测”。 - oberstet
2
不,它并不意味着那样。证书是由浏览器验证的(在这种情况下,“验证”意味着:检查证书是否符合内置于浏览器中的信任链的要求)。如果在浏览器之外运行,则 WebSocket 客户端当然可以并且应该自行验证服务器证书。 - oberstet
2
浏览器确实知道哪些CA是可接受的,以使服务器证书有效:信任存储中的CA证书。例如,在Windows上的IE / Chrome中,使用操作系统范围的信任存储。PC的用户/管理员可以修改信任存储。因此,您可以删除除一个CA证书之外的所有CA证书,如果服务器证书由该CA颁发,则浏览器将仅通过TLS连接到服务器。 - oberstet
1
问题是复数 - “CAs”。有一个有效的颁发CA(没有使用PKI桥梁进行计数签名或交叉认证)。没有必要信任CA动物园(或DNS)。这在过去曾给我们带来麻烦。这就是为什么Comodo黑客在使用被攻击的Diginotar根证书时成功了。也是为什么Trustwave在他们的MitM攻击中成功了。 - jww
1
是的,我同意这一点。服务器证书没有“固定”到特定的颁发机构是一个问题。目前有针对此问题的解决方案:http://security.stackexchange.com/questions/29988/what-is-certificate-pinning - oberstet
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接