如何给 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-应用程序。
这里有一些链接以获取更多信息:
请原谅我的新问题,但我很困惑,显然不理解如何使用托管在 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-应用程序。
这里有一些链接以获取更多信息: