Java Secure Websocket — Загрузите контекст SSL из файла сертификата TLS и подключитесь к URI WSS

#java #ssl #websocket #java-websocket

Вопрос:

Я ищу способ загрузить файл сертификата TLS ( ssl_cert_auth_params ), который выглядит следующим образом:

 -----BEGIN CERTIFICATE-----
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
************************
-----END CERTIFICATE-----
 

В клиенте Java WSS (Secure WebSocket).

Я могу легко настроить ssl_context в python с помощью этого:

 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.

Комментарии:

1. какую клиентскую библиотеку java wss вы планируете использовать?

2. в данный момент тот, который легко подходит для этой цели, когда у меня будет больше вариантов, которые я выберу, предложения с радостью принимаются

Ответ №1:

Я не эксперт по веб-сайтам, но вот фрагмент, который должен помочь вам в java с веб-сайтами для пристани:

Я использовал следующие библиотеки:

 <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 и отображения его в объект хранилища ключей, а затем передадите его в TrustManager, а затем создадите из него SSLContext. Поэтому я предлагаю свою собственную библиотеку, чтобы скрыть многословие. Надеюсь, вам понравится 🙂

Комментарии:

1. Мило! И обычно я тоже могу использовать URI конечной точки «wss://», верно? Как только я смогу правильно проверить свою конечную точку в ближайшие недели, я вернусь, чтобы принять это, если не будет предоставлено никаких других лучших ответов. Спасибо!

2. Да, я попробовал пример ссылки wss на URI, и это сработало. Однако я не смог протестировать часть SSL, так как у меня нет защищенного сервера wss. Поэтому я хотел бы услышать ваши результаты

3. @madx какие-либо обновления с вашей стороны, вы смогли опробовать его с помощью ssl?