WebSocket con SSL

115

¿Es posible tener WebSockets con HTTPS?

Al cambiar a HTTPS, mi WebSocket devuelve un error de seguridad y funciona perfectamente con HTTP normal.

A continuación, un fragmento;

socket = new WebSocket("ws://my_www:1235"); 
Eric
fuente
mi mal, me di cuenta de que el servidor de socket AIR que estoy usando no es seguro, tengo que volver a escribir para usar flash.net.SecureSocket ...
Eric

Respuestas:

170

La conexión WebSocket comienza su vida con un protocolo de enlace HTTP o HTTPS. Cuando se accede a la página a través de HTTP, puede utilizar WS o WSS (WebSocket seguro: WS sobre TLS). Sin embargo, cuando su página se carga a través de HTTPS, solo puede usar WSS; los navegadores no permiten "degradar" la seguridad.

Peter Moskovits
fuente
eso es lo que tengo, pero me di cuenta de que el servidor de socket AIR que estoy usando no es seguro, tengo que volver a escribir para usar flash.net.SecureSocket ...
Eric
Flash también tiene serios problemas ... ¿Está creando un servidor WebSocket (si es así, por qué) o está creando una aplicación?
Peter Moskovits
1
Tengo un servidor de socket AIR que funciona sí.
Eric
Entonces, ¿cómo seleccionar WSS si la página no está cargada con HTTP?
anatoly techtonik
29

No puede usar WebSockets sobre HTTPS, pero puede usar WebSockets sobre TLS (HTTPS es HTTP sobre TLS). Simplemente use "wss: //" en el URI.

Creo que la versión reciente de Firefox no le permitirá usar WebSockets que no sean TLS desde una página HTTPS, pero lo contrario no debería ser un problema.

canaca
fuente
Entonces, ¿cuál es la solución? Tengo un servidor WS que se ejecuta sobre http ahora compré un SSL y el navegador ya no me permite conectarme con WS.
Cambié
@muaaz su servidor WebSocket debe estar ejecutándose en modo WSS y preferiblemente cargado con el mismo certificado / claves SSL que su servidor web que está sirviendo sus páginas web de origen que intentan conectarse al servidor websocket.
kanaka
4
Gracias. por cierto, acabo de resolverlo mediante proxy (usando apache) la solicitud de wss://a ws://. Entonces, uso wss://ws.domain.comy apache aplico el proxy en él y redirijo la solicitud donde se está ejecutando el servidor WS. por ejemplo: ws://10.12.23.45:5641/server.php. y sé que es una muy mala solución, aunque a mí me funciona. Agradecería su ayuda si me guiara a través de la configuración de apache. por ejemplo: donde poner el .certetc. gracias!
muaaz
@muaaz lo siento, no conozco la configuración de Apache, aparte de buscarla en Google.
kanaka
21

1 advertencia adicional (además de la respuesta de kanaka / peter): si usa WSS y el certificado del servidor no es aceptable para el navegador, es posible que no obtenga ningún cuadro de diálogo del navegador (como sucede con las páginas web). Esto se debe a que WebSockets se trata como un "subrecurso" y el certificado acepta / excepción de seguridad / cualquier cuadro de diálogo que no se represente para los subrecursos.

oberstet
fuente
¿Incluso si es el mismo certificado que el utilizado para HTTPS?
vekah
1
¿Qué quieres decir con "diálogo renderizado por navegador"? Al igual que alert()?
Ivan Perevezentsev
2
Diálogos que se originan de forma nativa dentro del navegador (no una página). Como "este certificado no es válido, ¿quieres continuar?"
oberstet
entonces, ¿hay alguna manera de superar esto? Si utilizo un certificado autofirmado, ¿puedo seguir usando websocket?
OhadR