SSL Websocket с использованием StompClient - исключение SSL-сертификата

У меня есть простой Java StompClient, подключающийся к событиям Java websocket. Работает, когда сервер настроен как ws. Невозможно подключиться, если сервер настроен как wss. Фрагмент кода ниже ...

KeyStore truststore = KeyStore.getInstance("JKS");
truststore.load(this.getClass().getResourceAsStream("/truststore.jks"), "<hidden_pwd_for_thispost>".toCharArray());
KeyStore keystore = KeyStore.getInstance("JKS");;
keystore.load(this.getClass().getResourceAsStream("/keystore.jks"), "<hidden_pwd_for_thispost>".toCharArray());

SSLContext sslContext = new 
SSLContextBuilder().loadTrustMaterial(truststore, acceptingTrustStrategy);
            .loadKeyMaterial(keystore, "<hidden_pwd_forthisPost>".toCharArray()).build();
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
StandardWebSocketClient client = new StandardWebSocketClient();
client.getUserProperties().clear();
client.getUserProperties().put("org.apache.tomcat.websocket.SSL_CONTEXT", sslContext);
WebSocketStompClient stompClient = new WebSocketStompClient(client);   
ListenableFuture<StompSession> sessionFuture = stompClient.connect(url, handler);
session = sessionFuture.get();

Исключение

Caused by: java.security.cert.CertificateException: No name matching <myhost> found
at sun.security.util.HostnameChecker.matchDNS(Unknown Source)
at sun.security.util.HostnameChecker.match(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(Unknown Source)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(Unknown Source)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(Unknown Source)

Обратите внимание, что я создал хранилище ключей и самоподписанное хранилище доверия локально. Anf и keyStore, и trustStore имеют CN в качестве моего имени хоста. Проверено выше, запустив keytool -list

Могут ли некоторые предложить. Ваша помощь очень ценится.

Приносим извинения, если на этот вопрос уже дан ответ, я искал пока безрезультатно. Отсюда публикация.

Спасибо,

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 532
1

Ответы 1

Соответствует ли альтернативное имя субъекта в вашем сертификате имени хоста сервера?

X509v3 extensions:
    X509v3 Subject Alternative Name:
        DNS:<**HOST name which matches the server host name**>

Вы можете проверить это, выполнив следующие шаги:

•   openssl s_client -connect <serverhostname>:<port on which you connect>
•   Copy the string from -----BEGIN CERTIFICATE-----  till     -----END CERTIFICATE-----
•   Paste the string into a .pem file, for example:- “test.pem”
•   Run command:   openssl x509 -in test.pem -noout -text

Если SAN не имеет имени хоста, тогда появляется DN: См. Это: - CertificateException: имя, совпадающее с ssl.someUrl.de, не найдено


ОБНОВИТЬ:

Если вы пытаетесь добиться взаимной аутентификации, это означает, что и сервер, и клиент должны иметь свой собственный сертификат. На основе кода _stompClient.connect (url, обработчик); мне кажется, что сервер Websocket, вызываемый StompClient, действует здесь как сервер, а ваш вызывающий код является клиентом. Исходя из этого понимания, вы должны правильно настроить свои сертификаты. Я думаю, вам нужно предоставить более подробную информацию по вопросу, чтобы прояснить, как вы все настроили. SSL - сложная тема, даже небольшая ошибка в конфигурации может привести к ошибке. (Это видно из того факта, что WS работает, но не WSS).


ОБНОВИТЬ:

Основываясь на вашем обновленном комментарии, это означает, что сертификата клиента нет на картинке, поэтому клиентом не будет взаимной аутентификации, а будет использоваться только сертификат сервера, и он проверит, доверяет ли он сертификату сервера, что означает ЦС, который подписывает сервер сертификат должен присутствовать в хранилище доверенных сертификатов клиента. Если ваш сервер доступен как веб-сервер, вы можете попробовать открыть его через браузер и проверить, показывает ли он действительный сертификат, если вы используете https для доступа к любому ресурсу / пользовательскому интерфейсу. Это должно, по крайней мере, помочь выяснить, правильно ли настроен сертификат или нет.

Привет, спасибо за ответ. Сделал все указанные шаги. Я не вижу подходящего тега. Расширения X509v3: X509v3 Альтернативное имя субъекта: есть ли другой способ, кроме взлома / etc / host, для сопоставления с IP-адресом CN = {host_name_in_server_certificate}? Я пишу, что это клиент, мы потенциально можем подключиться к серверу (-ам). Спасибо!

Prashanth G 18.10.2018 14:30

Хорошо, как вы проверили правильность CN в вашем хранилище ключей? Кроме того, вы упомянули, что создали хранилище доверия с собственной подписью, что кажется неверным. Надеюсь, вы имели в виду самоподписанный сертификат. Можно обратиться к этому и убедиться, что вы правильно выполнили шаги: - community.pivotal.io/s/article/… или для получения более подробной информации: - docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html

Ankur Chrungoo 18.10.2018 14:34

Помните, что в хранилище доверенных сертификатов должны храниться сертификаты доверенных центров сертификации, а в хранилище ключей должен храниться ваш фактический сертификат сервера и закрытый ключ. Также важно отметить, какой тип SSL вы пытаетесь достичь и что действует как сервер и клиент? Вы пытаетесь добиться взаимной проверки подлинности SSL или только проверки подлинности сервера?

Ankur Chrungoo 18.10.2018 14:38

Да, я имел в виду самоподписанный сертификат. Я использовал blogs.oracle.com/blogbypuneeth/… для его создания. keytool -list на .jks показывает CN = {hostname_that_am_connecting}, вот как я проверил.

Prashanth G 18.10.2018 14:40

Я пытаюсь добиться взаимной SSL-аутентификации

Prashanth G 18.10.2018 14:41

Если вы пытаетесь добиться взаимной аутентификации, это означает, что и сервер, и клиент должны иметь свой собственный сертификат. На основе кода _stompClient.connect (url, обработчик); мне кажется, что StompClient здесь действует как сервер, а ваш вызывающий код - это клиент. Исходя из этого понимания, вы должны правильно настроить свои сертификаты. Я думаю, вам нужно предоставить более подробную информацию по вопросу, чтобы прояснить, как вы все настроили. SSL - сложная тема, даже небольшая ошибка в конфигурации может привести к ошибке. (Это видно из того факта, что WS работает, но не WSS).

Ankur Chrungoo 18.10.2018 14:48

Привет, я пытаюсь подписаться на темы с веб-доступом, используя StompClient. После кода подключения выглядит как session.subscribe (тема, обработчик); Таким образом, при индивидуальном обновлении темы websocket обрабатывается отдельная бизнес-логика. Согласен по части WSS!

Prashanth G 18.10.2018 15:08

Теперь. Мы собираемся использовать сертификат, который имеет тот же CN, что и сервер. Сопоставление CN с фактическим ip в / etx / host. Спасибо! для всех разъяснений.

Prashanth G 18.10.2018 15:16

Это означает, что сертификата клиента нет на изображении, поэтому клиентом не будет использоваться взаимная проверка подлинности, а будет использоваться только сертификат сервера, и он проверит, доверяет ли он сертификату сервера, что означает, что ЦС, подписывающий сертификат сервера, должен присутствовать в магазин доверия клиента. Если ваш сервер доступен как веб-сервер, вы можете попробовать открыть его через браузер и проверить, показывает ли он действительный сертификат, если вы используете https для доступа к любому ресурсу / пользовательскому интерфейсу. Это должно, по крайней мере, помочь выяснить, правильно ли настроен сертификат или нет.

Ankur Chrungoo 18.10.2018 15:41

Я так и сделал. Сертификат загружен из браузера только для того, чтобы понять, что команда, раскрывающая эту тему веб-сокета на стороне сервера, предоставляет «тестовые» сертификаты. Итак, используя это сейчас и добавив записи в / etc / host. Опять таки! спасибо за помощь ... очень признателен.

Prashanth G 18.10.2018 15:44

Что именно вы подразумеваете под свидетельством об испытании? У него неправильная конфигурация?

Ankur Chrungoo 18.10.2018 15:46

Сертификат, созданный командой для подключения ко всем тестовым средам. Вместо того, чтобы генерировать его на нашем конце, отправили :)

Prashanth G 18.10.2018 15:51

Да пока. Но я верю, что он вернется позже, когда мы попытаемся подключить более одного сервера для обновлений. Сказав, что также необходимо, чтобы сертификат сервера отличался для каждого сервера. Спасибо!!!

Prashanth G 18.10.2018 15:56

Рад слышать! Я обновил ответ подробностями. Если ответ вам помог, вы можете проголосовать за него или закрыть вопрос, приняв ответ. stackoverflow.com/help/someone-answers. Удачи!

Ankur Chrungoo 18.10.2018 16:07

Выполнено. Спасибо за помощь.

Prashanth G 18.10.2018 16:56

Другие вопросы по теме