#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?