【问题标题】:How to give certificate to Java Websocket?如何给 Java Websocket 颁发证书?
【发布时间】:2022-01-10 15:09:00
【问题描述】:

请原谅我的新手问题,但我很困惑,显然不理解如何使用托管在HTTPS 上的 Websocket 服务器的基本原理或解释。我在网上找到的所有内容都让我的问题多于答案。

我在我的HTTPS 网站上使用 Java 代码托管了一个 Websocket 服务器。

这是我的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;
    }

}

然后我像这样开始WebsocketServer

WebsocketServer websocketServer;
// Start socket server
websocketServer = new WebsocketServer();
websocketServer.start();

在客户端,我像这样连接到它:

    // APP_WEB_SOCKET is the url to my site: api.my_custom_domain.com
    var connection = new WebSocket("wss://" + APP_WEB_SOCKET + ":6868");

问题: 我一直在读到,如果我想使用 wss 而不是 HTTPS,我需要一个证书,但找不到任何文件以我能理解的方式解释这意味着什么。

我的应用程序托管在 AWS Elastic Beanstalk 环境中。我是否需要在我的 Java 代码中以某种方式将证书添加到 WebsocketServer 的设置中? 示例:

WebsocketServer websocketServer;
// Start socket server
websocketServer = new WebsocketServer();

// example guessing
websocketServer.cert = "SOMETHING";??
websocketServer.start();

客户端代码是否需要更改?

谁需要证书?

如果有人能解释我缺少什么或指出正确的方向,我将不胜感激。

【问题讨论】:

  • Websocket 连接是“升级的 HTTP(S) 调用”,因此您的 HTTP 服务器需要证书才能“与 HTTPS 通信”,然后出于 WS 目的连接到它应该会自动执行正确的操作.

标签: java websocket java-websocket ws


【解决方案1】:

保持轻松。
应用程序中的证书很复杂 - 它们很难管理,并且在现代云环境中运行应用程序时会遇到问题(启动新环境、更新证书、扩展应用程序......)。

简单的结论:不要实施任何证书。

如何获得加密连接?

正如 Mike 在 cmets 中已经指出的那样:WebSockets 只是升级的 HTTP(S) 连接。一个普通的网络服务器(nginx、apache)负责证书。它可以在 kubernetes(作为入口控制器)或“裸机”网络服务器中完成。
他们都应该充当反向代理。这意味着:您的 java 应用程序对证书一无所知。它只有未加密的连接 - 就像您在端口 6868 上的代码一样。
但是客户端不会使用这个端口。 6868 只能在内部访问。

客户端将在正常的 HTTPS 端口 (=443) 调用您的反向代理。反向代理会将连接转发到您的 java 应用程序。

这里有一些链接以获取更多信息:

【讨论】:

  • 这是否意味着我使用端口 443(在客户端)连接到在端口 6868 上运行的 Web 套接字服务器?或者这里的程序是什么?
  • 是的,正确的。反向代理可以处理由路径标识的多个服务。 yoursite.com/ws 是 websocket-endpoint,yoursite.com/api 是普通后端。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多