Прежде всего, извините за мой английский, но, возможно, я смогу вам помочь, даже если вопросу уже четыре года, и, возможно, у кого-то будет такая же проблема.
Вот так..
Если вы используете, например, "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
ERR_CONNECTION_REFUSED
может означать, что вы подключаетесь к неправильному порту, а не к сокету порта, который слушает WebServer. Вы подключаетесь к правильному порту? - person Sergey Maksimenko   schedule 08.07.2015