Java 安全 Websocket - 从 TLS 证书文件加载 SSL 上下文并连接到 WSS URI
Java Secure Websocket - Load SSL context from TLS cert file and connect to WSS URI
我正在寻找一种加载如下所示的 TLS 证书文件 (ssl_cert_auth_params
) 的方法:
-----BEGIN CERTIFICATE-----
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
************************
-----END CERTIFICATE-----
在 Java WSS(安全 WebSocket)客户端中。
我可以轻松地在 python 中设置 ssl_context
,方法是:
import ssl
import pathlib
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
localhost_pem = pathlib.Path(__file__).resolve().parent / "../../folder/ssl_cert_auth_params"
ssl_context.load_verify_locations(localhost_pem)
并使用此连接到 WSS uri:
import asyncio
import websockets
async def connect_to_uri(uri, ssl_context):
ws = await websockets.connect(uri, ssl=ssl_context, ping_interval=3)
return (ws)
loop = asyncio.get_event_loop()
ws = loop.run_until_complete(connect_to_uri(uri, ssl_context))
但是我找不到一种简单的方法来对 java wss 客户端库.
做同样的事情
我不是 websocket 专家,但这里有一个片段应该可以在 java 中使用 WebSockets for Jetty 为您解决问题:
我使用了以下库:
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-client</artifactId>
<version>9.4.41.v20210516</version>
</dependency>
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart-for-jetty</artifactId>
<version>6.6.1</version>
</dependency>
和Java代码:
import nl.altindag.ssl.SSLFactory;
import nl.altindag.ssl.util.CertificateUtils;
import nl.altindag.ssl.util.JettySslUtils;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import java.net.URI;
import java.nio.file.Paths;
public class WebSocketExample {
public static void main(String[] args) throws Exception {
var sslFactory = SSLFactory.builder()
.withTrustMaterial(CertificateUtils.loadCertificate(Paths.get("/path/to/certificate.pem")))
.build();
var sslContextFactory = JettySslUtils.forClient(sslFactory);
var httpClient = new HttpClient(sslContextFactory);
var webSocketClient = new WebSocketClient(httpClient);
webSocketClient.start();
var session = webSocketClient.connect(new MyWebSocketListener(), new URI("ws://echo.websocket.org")).get();
session.getRemote().sendString("Hello there!");
}
private static class MyWebSocketListener implements WebSocketListener {
@Override
public void onWebSocketBinary(byte[] bytes, int i, int i1) {
System.out.println();
}
@Override
public void onWebSocketText(String response) {
System.out.println(response);
}
@Override
public void onWebSocketClose(int i, String s) {
System.out.println("closed");
}
@Override
public void onWebSocketConnect(Session session) {
System.out.println("connected");
}
@Override
public void onWebSocketError(Throwable throwable) {
System.out.println("got error");
}
}
}
Jetty SslContextFactory 没有直接读取和使用pem 文件的功能。因此,您最终会添加逻辑来读取 pem 文件并将其映射到 KeyStore 对象,然后将其提供给 TrustManager,然后从中创建 SSLContext。因此,我建议我自己的库来隐藏冗长的内容。希望你喜欢:)
我正在寻找一种加载如下所示的 TLS 证书文件 (ssl_cert_auth_params
) 的方法:
-----BEGIN CERTIFICATE-----
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
************************
-----END CERTIFICATE-----
在 Java WSS(安全 WebSocket)客户端中。
我可以轻松地在 python 中设置 ssl_context
,方法是:
import ssl
import pathlib
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
localhost_pem = pathlib.Path(__file__).resolve().parent / "../../folder/ssl_cert_auth_params"
ssl_context.load_verify_locations(localhost_pem)
并使用此连接到 WSS uri:
import asyncio
import websockets
async def connect_to_uri(uri, ssl_context):
ws = await websockets.connect(uri, ssl=ssl_context, ping_interval=3)
return (ws)
loop = asyncio.get_event_loop()
ws = loop.run_until_complete(connect_to_uri(uri, ssl_context))
但是我找不到一种简单的方法来对 java wss 客户端库.
做同样的事情我不是 websocket 专家,但这里有一个片段应该可以在 java 中使用 WebSockets for Jetty 为您解决问题:
我使用了以下库:
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-client</artifactId>
<version>9.4.41.v20210516</version>
</dependency>
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart-for-jetty</artifactId>
<version>6.6.1</version>
</dependency>
和Java代码:
import nl.altindag.ssl.SSLFactory;
import nl.altindag.ssl.util.CertificateUtils;
import nl.altindag.ssl.util.JettySslUtils;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import java.net.URI;
import java.nio.file.Paths;
public class WebSocketExample {
public static void main(String[] args) throws Exception {
var sslFactory = SSLFactory.builder()
.withTrustMaterial(CertificateUtils.loadCertificate(Paths.get("/path/to/certificate.pem")))
.build();
var sslContextFactory = JettySslUtils.forClient(sslFactory);
var httpClient = new HttpClient(sslContextFactory);
var webSocketClient = new WebSocketClient(httpClient);
webSocketClient.start();
var session = webSocketClient.connect(new MyWebSocketListener(), new URI("ws://echo.websocket.org")).get();
session.getRemote().sendString("Hello there!");
}
private static class MyWebSocketListener implements WebSocketListener {
@Override
public void onWebSocketBinary(byte[] bytes, int i, int i1) {
System.out.println();
}
@Override
public void onWebSocketText(String response) {
System.out.println(response);
}
@Override
public void onWebSocketClose(int i, String s) {
System.out.println("closed");
}
@Override
public void onWebSocketConnect(Session session) {
System.out.println("connected");
}
@Override
public void onWebSocketError(Throwable throwable) {
System.out.println("got error");
}
}
}
Jetty SslContextFactory 没有直接读取和使用pem 文件的功能。因此,您最终会添加逻辑来读取 pem 文件并将其映射到 KeyStore 对象,然后将其提供给 TrustManager,然后从中创建 SSLContext。因此,我建议我自己的库来隐藏冗长的内容。希望你喜欢:)