Я пытаюсь реализовать клиент WebSocket в приложении, которое поддерживает безопасную передачу через SSL. Приложение уже поддерживает стандартные соединения SSL через HTTP, реализуя настраиваемые диспетчеры ключей и доверия (эти настраиваемые реализации позволяют при необходимости запрашивать у пользователя сертификат).
У меня возникли проблемы с безопасным подключением к нашей удаленной конечной точке WebSocket. Сбой происходит во время рукопожатия. Я пробовал две разные реализации WebSocket API (и Tyrus, и Jetty), и обе терпели одинаковую ошибку, что, конечно же, заставляет меня указать на нашу реализацию SSL.
Как я уже упоминал, сбой происходит во время рукопожатия. Кажется, что соединение не может понять, что есть клиентские сертификаты, подписанные поддерживаемыми органами власти, возвращенными с сервера. Я не могу понять, правильно ли я предоставил клиентские сертификаты для WebSocket API или наши пользовательские менеджеры ключей / доверия даже не используются.
Вот дамп журналов отладки SSL:
*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
(list of about 15 cert authorities supported by the server)
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** CertificateChain
<empty>
***
Я установил точки останова в нашей реализации TrustManager, чтобы определить, вызываются ли они когда-либо, и кажется, что в данный момент они не вызываются.
Я пытался отладить это в течение нескольких дней, и у меня заканчиваются вещи, чтобы попробовать.
Любые предложения будут ценны!
Вот фрагмент кода Jetty:
SSLContext context = SSLContext.getInstance("TLS");
// getKeyManagers / getTrustManagers retrieves an
// array containing the custom key and trust manager
// instances:
KeyManager[] km = getKeyManagers();
TrustManager[] tm = getTrustManagers();
context.init(km, tm, null);
SslContextFactory contextFactory = new SslContextFactory();
contextFactory.setContext(context);
WebSocketClient client = new WebSocketClient(contextFactory);
SimpleEchoClient echoClient = new SimpleEchoClient();
try {
client.start();
ClientUpgradeRequest request = new ClientUpgradeRequest();
Future<Session> connection = client.connect(echoClient, uri, request);
Session session = connection.get();
// if everything works, do stuff here
session.close();
client.destroy();
} catch (Exception e) {
LOG.error(e);
}
new SslContextFactory(true);
, это сработает? - person Joakim Erdfelt   schedule 27.06.2017client.start();
какое значение имеетcontextFactory.getState()
? - person Joakim Erdfelt   schedule 27.06.2017client.start()
значениеcontextFactory.getState()
равноSTARTED
. Попытка без моих пользовательских менеджеров иnew SslContextFactory(true)
приводит к такому же поведению. - person Robert K   schedule 27.06.2017wss://echo.websocket.org
и вашим кодом. Какую версию Jetty вы используете? (пожалуйста, скажите недавний стабильный выпуск) - person Joakim Erdfelt   schedule 27.06.2017