WebSocket com SSL

116

É possível ter WebSockets com HTTPS?

Ao mudar para HTTPS, meu WebSocket retorna um erro de segurança e funciona perfeitamente com HTTP normal.

Abaixo, um trecho;

socket = new WebSocket("ws://my_www:1235"); 
Eric
fonte
meu mal, percebi que o servidor de socket AIR que estou usando não é seguro, tenho que reescrever para usar flash.net.SecureSocket ...
Eric,

Respostas:

171

A conexão WebSocket começa sua vida com um handshake HTTP ou HTTPS. Quando a página é acessada através de HTTP, você pode usar WS ou WSS (WebSocket secure: WS over TLS). No entanto, quando sua página é carregada por meio de HTTPS, você só pode usar WSS - os navegadores não permitem o "downgrade" da segurança.

Peter Moskovits
fonte
isso é o que eu tenho, mas percebi que o servidor de soquete AIR que estou usando não é seguro, tenho que reescrever para usar flash.net.SecureSocket ...
Eric,
O Flash também tem seus sérios problemas ... Você está construindo um servidor WebSocket (se sim, por quê) ou está construindo um aplicativo?
Peter Moskovits
1
Eu tenho um servidor de soquete AIR executando sim.
Eric,
Então, como selecionar WSS se a página não for carregada com HTTP?
anatoly techtonik
30

Você não pode usar WebSockets sobre HTTPS, mas pode usar WebSockets sobre TLS (HTTPS é HTTP sobre TLS). Basta usar "wss: //" no URI.

Acredito que a versão recente do Firefox não permitirá que você use WebSockets não-TLS de uma página HTTPS, mas o inverso não deve ser um problema.

Kanaka
fonte
Então, qual é a solução? Tenho um servidor WS rodando em http agora comprei um SSL e o navegador não permite mais conexão com WS. Transformei WS em WSS: // e agora não está se conectando com WebSocket
muaaz
@muaaz seu servidor WebSocket deve estar rodando no modo WSS e de preferência carregado com o mesmo certificado / chaves SSL do seu servidor web que está servindo suas páginas web de origem que estão tentando se conectar ao servidor websocket.
Kanaka
4
Obrigado. btw, eu acabei de resolver isso por proxy (usando apache) a solicitação de wss://para ws://. Então, eu uso um wss://ws.domain.comapache e aplico o proxy nele e redireciono a solicitação para onde o servidor WS está sendo executado. por exemplo: ws://10.12.23.45:5641/server.php. e eu sei que é uma solução muito ruim - embora funcione para mim. Eu aprecio sua ajuda se você me guiar através da configuração do apache. por exemplo: onde colocar o .certetc. obrigado!
muaaz
@muaaz desculpe, eu não conheço a configuração do apache além de pesquisá-la no Google.
Kanaka de
21

1 advertência adicional (além da resposta de kanaka / peter): se você usar WSS e o certificado do servidor não for aceitável para o navegador, você não poderá obter nenhuma caixa de diálogo renderizada do navegador (como acontece com as páginas da Web). Isso ocorre porque o WebSockets é tratado como um "sub-recurso", e o certificado aceita / exceção de segurança / quaisquer diálogos que não são renderizados para os sub-recursos.

oberstet
fonte
Mesmo que seja o mesmo certificado usado para HTTPS?
vekah 01 de
1
O que você quer dizer com "caixa de diálogo renderizada do navegador"? Gostou alert()?
Ivan Perevezentsev
2
Diálogos que se originam nativamente no navegador (não em uma página). Como "este certificado é inválido, deseja continuar?"
oberstet
então existe uma maneira de superar isso? se eu usar um certificado autoassinado, ainda posso usar o websocket?
OhadR 01 de