簡體   English   中英

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)客戶端中。

我可以使用以下命令輕松設置ssl_context中的 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 中為您解決問題,其中包含用於 Jetty 的 WebSockets:

我使用了以下庫:

<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 沒有 function 將直接讀取和使用 pem 文件。 因此,您最終會添加邏輯來讀取 pem 文件並將 map 放入 KeyStore object,然后將其提供給 TrustManager,然后從中創建 SSLContext。 因此,我建議我自己的庫來隱藏冗長。 我希望你喜歡它:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM