带SSL的WebSocket


115

是否可以使用带有HTTPS的WebSocket?

切换到HTTPS时,我的WebSocket返回一个安全错误,并且可以与常规HTTP完美配合。

下面是一个片段;

socket = new WebSocket("ws://my_www:1235"); 

我不好,我意识到我使用的AIR套接字服务器不安全,我必须重写才能使用flash.net.SecureSocket ...
Eric

Answers:


170

WebSocket连接通过HTTP或HTTPS握手开始其寿命。通过HTTP访问页面时,可以使用WS或WSS(WebSocket安全:WS over TLS)。但是,通过HTTPS加载页面时,只能使用WSS-浏览器不允许“降级”安全性。


那就是我所拥有的,但是我意识到我使用的AIR套接字服务器并不安全,我必须重写才能使用flash.net.SecureSocket ...
Eric

Flash也有其严重的问题...您是在构建WebSocket服务器(如果是,为什么),还是在构建应用程序?
彼得·莫斯科维茨

1
我有一个运行AIR套接字服务器。
埃里克

那么,如果页面未使用HTTP加载,如何选择WSS?
anatoly techtonik 2014年

29

您不能在HTTPS上使用WebSockets,但可以在TLS上使用WebSockets(HTTPS是TLS上的HTTP)。只需在URI中使用“ wss://”即可。

我相信Firefox的最新版本不会允许您从HTTPS页面使用非TLS WebSocket,但是相反应该不是问题。


那么,有什么解决方案?我有一台运行在http上的WS服务器,现在我购买了SSL,浏览器不再允许我连接WS。我将WS转到WSS://,但现在它未与WebSocket连接
muaaz

@muaaz,您的WebSocket服务器应以WSS模式运行,并且最好加载与为试图连接到Websocket服务器的原始网页提供服务的Web服务器相同的SSL证书/密钥。
kanaka'1

4
谢谢。顺便说一句,我刚刚通过代理(使用apache)从wss://到的请求解决了这个问题ws://。因此,我使用wss://ws.domain.comapache并在其上应用代理,并在运行WS服务器的地方重定向请求。例如:ws://10.12.23.45:5641/server.php。我知道这是一个非常糟糕的解决方案-尽管它对我有用。如果您指导我完成apache配置,我们将不胜感激。例如:放在哪里.cert等等。谢谢!
muaaz

@muaaz抱歉,除了自己自己搜索之外,我不知道apache配置。
kanaka

21

其他1个警告(除了kanaka / peter的回答):如果您使用WSS,并且浏览器不接受服务器证书,则可能无法获得任何浏览器呈现的对话框(就像在Web页面上那样)。这是因为WebSockets被视为所谓的“子资源”,并且证书接受/安全例外/任何未为子资源呈现的对话框。


即使它与用于HTTPS的证书相同?
vekah,2015年

1
“浏览器渲染对话框”是什么意思?喜欢alert()吗?
伊万·佩雷维岑茨夫

2
在浏览器(而非页面)中本地产生的对话框。就像“此证书无效,您要继续吗?”
oberstet

有没有办法克服这个问题?如果我使用自签名证书,还可以使用websocket吗?
OhadR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.