Perdóneme por la pregunta del novato, pero estoy confundido y obviamente no entiendo los fundamentos o las explicaciones de cómo usar un servidor Websocket alojado en HTTPS . Todo lo que encuentro en línea me lleva a tener más preguntas que respuestas.
Tengo un servidor Websocket alojado en mi sitio web HTTPS usando código Java.
Este es mi archivo WebsocketServer.java :
import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; import java.net.InetSocketAddress; import java.util.HashSet; import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class WebsocketServer extends WebSocketServer { private static final Logger logger = LogManager.getLogger(WebsocketServer.class); private static int TCP_PORT = 6868; private static Set<WebSocket> conns; public WebsocketServer() { super(new InetSocketAddress(TCP_PORT)); conns = new HashSet<>(); } @Override public void onOpen(WebSocket conn, ClientHandshake handshake) { conns.add(conn); logger.info("New connection from " + conn.getRemoteSocketAddress().getAddress().getHostAddress()); logger.info("Size of connection list: " + conns.size()); } @Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { conns.remove(conn); logger.info("Closed connection to " + conn.getRemoteSocketAddress().getAddress().getHostAddress()); } @Override public void onMessage(WebSocket conn, String message) { logger.info("Message from client: {}", message); // for (WebSocket sock : conns) { // sock.send("SENDING BACK" + message); // } } @Override public void onError(WebSocket conn, Exception ex) { // ex.printStackTrace(); try { if (conn != null) { conns.remove(conn); // do some thing if required } logger.info("ERROR from {}", conn.getRemoteSocketAddress().getAddress().getHostAddress()); } catch (Exception e) { logger.info("onError: WebSocketServer may already be running"); } } public Set<WebSocket> getConns() { return conns; } } Luego comencé el WebsocketServer así:
WebsocketServer websocketServer; // Start socket server websocketServer = new WebsocketServer(); websocketServer.start();Y en el lado del cliente, me conecto así:
// APP_WEB_SOCKET is the url to my site: api.my_custom_domain.com var connection = new WebSocket("wss://" + APP_WEB_SOCKET + ":6868"); PREGUNTAS: sigo leyendo que necesito un certificado si quiero usar wss sobre HTTPS , pero no puedo encontrar ningún documento que explique lo que esto significa de una manera que pueda entender.
Mi aplicación está alojada en el entorno de AWS Elastic Beanstalk. ¿Debo agregar de alguna manera un certificado a la configuración de WebsocketServer en mi código Java? Ejemplo:
WebsocketServer websocketServer; // Start socket server websocketServer = new WebsocketServer(); // example guessing websocketServer.cert = "SOMETHING";?? websocketServer.start();¿Es necesario cambiar el código de cliente?
¿Quién necesita el certificado?
Si alguien pudiera explicarme lo que me estoy perdiendo o indicarme la dirección correcta, se lo agradecería mucho.
Manténgalo fácil.
Los certificados dentro de su aplicación son complejos: son difíciles de administrar y tendrá problemas para ejecutar su aplicación en un entorno de nube moderno (iniciar nuevos entornos, renovar certificados, escalar su aplicación, ...).
Conclusión simple: no implemente ningún certificado.
Como Mike ya señaló en los comentarios: los WebSockets son simplemente conexiones HTTP(S) actualizadas. Un servidor web normal (nginx, apache) se encarga de los certificados. Se puede hacer en kubernetes (como controlador de entrada) o con un servidor web "bare-metal".
Ambos deberían actuar como un proxy inverso. Esto significa: su aplicación Java no sabe nada sobre certificados. Solo tiene conexiones sin cifrar, como en su código en el puerto 6868 .
Pero el cliente no utilizará este puerto. 6868 solo es accesible internamente.
El cliente llamará a su proxy inverso en el puerto HTTPS normal (=443). El proxy inverso reenviará la conexión a su aplicación Java.
Aquí algunos enlaces para más información: