Проблемы рукопожатия Java8 Secure WebSocket (Tyrus и Jetty)

Я пытаюсь реализовать клиент 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);
}

person Robert K    schedule 27.06.2017    source источник
comment
Непонятно, с какой стороны эти логи ssl, клиент? сервер? что за сервер? как настроен/настроен сервер? работает ли сервер с другими клиентами ssl (например: openssl s_client)?   -  person Joakim Erdfelt    schedule 27.06.2017
comment
Эти журналы со стороны клиента. Мы также поддерживаем веб-версию (угловую) приложения, и эта конечная точка сервера работает с этой реализацией.   -  person Robert K    schedule 27.06.2017
comment
Если вы пропустите свой собственный TrustManager и KeyManager и просто используете new SslContextFactory(true);, это сработает?   -  person Joakim Erdfelt    schedule 27.06.2017
comment
После client.start(); какое значение имеет contextFactory.getState()?   -  person Joakim Erdfelt    schedule 27.06.2017
comment
После client.start() значение contextFactory.getState() равно STARTED. Попытка без моих пользовательских менеджеров и new SslContextFactory(true) приводит к такому же поведению.   -  person Robert K    schedule 27.06.2017
comment
Невозможно повторить с wss://echo.websocket.org и вашим кодом. Какую версию Jetty вы используете? (пожалуйста, скажите недавний стабильный выпуск)   -  person Joakim Erdfelt    schedule 27.06.2017
comment
Версия причала — 9.2.15.v20160210. Я попробую зайти на wss://echo.websocket.org   -  person Robert K    schedule 27.06.2017
comment
Мне удалось успешно подключиться к wss://echo.websocket.org, используя более новую версию причала (9.4.6.v20170531). Это доказывает, что я действительно могу написать клиент :) К сожалению, этот сайт не требует сертификата клиента для двустороннего SSL, так что я думаю, это указывает на конфигурацию SSLContext или SslContextFactory?   -  person Robert K    schedule 27.06.2017


Ответы (1)


вы можете попробовать с rejectUnAuthorized:false, чтобы ваши сертификаты, для которых ваш браузер не может авторизоваться, пропускали авторизацию.

var ws = new WebSocket('wss://localhost:xxxx', {
  protocolVersion: 8,
  origin: 'https://localhost:xxxx',
  rejectUnauthorized: false
});
person nagoor hussain    schedule 27.06.2017
comment
Это на самом деле не в браузере, это отдельное приложение Java. - person Robert K; 27.06.2017