Безопасный веб-сокет с HTTPS (SSL)

Я использую websocket(ws://) в своем веб-приложении. теперь я реализовал SSL в своем веб-приложении, поэтому я реализовал безопасный веб-сокет (wss://). Поэтому я следовал документам библиотеки TooTallNate, чтобы реализовать этот сценарий.

  1. Netty SSL и веб-сокеты

  2. SSLClientExample.java

Но я получаю этот URL-адрес в консоли браузера.

WebSocket connection to 'wss://localhost:9191/socket' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED.

Для реализации безопасного веб-сокета, какой алгоритм нам нужно передать в приведенном ниже коде?

SSLContext context = SSLContext.getInstance(Algorithm);

Поэтому, пожалуйста, помогите мне решить эту ошибку.


person sus007    schedule 03.12.2014    source источник
comment
У меня такая же ошибка. Вы когда-нибудь догадывались об этом?   -  person Nate    schedule 31.03.2015
comment
ERR_CONNECTION_REFUSED может означать, что вы подключаетесь к неправильному порту, а не к сокету порта, который слушает WebServer. Вы подключаетесь к правильному порту?   -  person Sergey Maksimenko    schedule 08.07.2015
comment
sslContext = SSLContext.getInstance(TLS)?   -  person vzamanillo    schedule 08.07.2015
comment
Вы пытались подключиться к порту, который не прослушивался. Проверьте свою конфигурацию.   -  person user207421    schedule 08.02.2019


Ответы (1)


Прежде всего, извините за мой английский, но, возможно, я смогу вам помочь, даже если вопросу уже четыре года, и, возможно, у кого-то будет такая же проблема.

Вот так..

Если вы используете, например, "ws://localhost:8025" веб-сокет Java, он не установит безопасное соединение, ознакомьтесь с документацией.

Websocket создаст безопасное соединение только в сочетании с SSL. В конце вы будете использовать "wss://localhost:8025".

Добавим SSL:

Прежде всего вам понадобится сеансовый ключ. Вы можете найти в своей папке JavaJDK (например, в C:\Program Files\Java\jdk1.8.0_191\bin\keytool.exe) файл с именем "keytool.exe" . Этот небольшой инструмент сгенерирует сеансовый ключ, который следует сохранить на стороне клиента и сервера.

Теперь используйте инструмент. Например:

keytool -genkey -keyalg RSA -validity 3650 -keystore "keystore.jks" -storepass "storepassword" -keypass "keypassword" -alias "default" -dname "CN=127.0.0.1, OU=MyOrgUnit, O=MyOrg, L=MyCity, S=MyRegion, C=MyCountry"

Я скопировал приведенный выше пример из:

https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/example/SSLClientExample.java

Теперь вы можете загрузить свой сеансовый ключ из определенного файла, который называется «KEYSTORE».

KeyStore ks = KeyStore.getInstance( STORETYPE );
            File kf = new File( KEYSTORE );
            ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray());

Вам нужно сгенерировать менеджер ключей и менеджер доверия. Автор использовал протокол "SunX509".

KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
            kmf.init( ks, KEYPASSWORD.toCharArray() );
            TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
            tmf.init( ks );

После этого пришло время получить «настоящий» SSL-контекст. Вам необходимо загрузить протокол TLS. SSL и TLS почти одинаковы. Когда вы создали ssl-сокет, вы можете создать новый сокет, который использует ssl/tls.

SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

Например: я использовал в начале

Session session = new Session(new Uri("wss://localhost:8025"));

Мой Session.class наследуется от WebSocketClient. Поэтому я могу использовать:

session.setSocket(sslSocketFactory.createSocket());
session.connect();

Примечание. Если вы хотите использовать «wss», вам необходимо реализовать SSL или «ws» без SSL.

Итак, что может быть не так с вашим кодом?

-> Вы не реализовали SSL на стороне сервера, поэтому он откажет в соединении

Этот код работает отлично, и я проверил его. Я только постет для клиентской стороны, но на стороне сервера будет тот же код :)

Я надеялся, что смогу помочь вам до сих пор.

person 8Dimension    schedule 07.02.2019
comment
Прежде всего вам понадобится пара открытый/закрытый ключ. Это не сеансовый ключ. Это два связанных ключа, и ни один из них не является ключом сеанса. Вам не нужно писать код, представленный здесь: вы можете сделать все это через системные свойства. Что он сделал неправильно, так это попытался подключиться к порту, который не слушал. На самом деле это не имело ничего общего с SSL как таковым. - person user207421; 08.02.2019