如何给 Java Websocket 证书?

How to give certificate to Java Websocket?

请原谅我的新问题,但我很困惑,显然不理解如何使用托管在 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");

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

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

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

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

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

谁需要证书?

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

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

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

如何获得加密连接?

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

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

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