JAVA, проблема с подключением SSLSocket

Я кодирую клиент-серверное приложение для чата. Я хочу зашифровать соединение между этими двумя. Я делаю это в первый раз, и мне трудно. Насколько я понимаю, мне нужно хранилище доверенных сертификатов для клиента и хранилище ключей для сервера. Я следовал этому руководству, чтобы создать их: http://peoplesofttutorial.com/generating-key-store-and-trust-store-using-keytool/

Клиент:

        System.setProperty("javax.net.ssl.trustStore" , "hrms.truststore");
        System.setProperty("javax.net.ssl.trustStorePassword" , "123456");
        SSLSocketFactory sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLsocket = (SSLSocket) sslsf.createSocket(server, port);   

Сервер:

        System.setProperty("javax.net.ssl.keyStore" , "pskey.keystore");
        System.setProperty("javax.net.ssl.keyStorePassword","123456");
        SSLServerSocketFactory sslsocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        sslserversocket = (SSLServerSocket) sslsocketfactory.createServerSocket(Port);      

Сервер запускается корректно. Когда я подключаю клиент, который работает на том же компьютере, что и сервер, я могу подключиться без каких-либо проблем, но когда я подключаюсь с другого компьютера, который находится в той же сети, я получаю эту ошибку: javax.net.ssl.SSLException: Received фатальное предупреждение: internal_error

Может ли кто-нибудь помочь мне решить эту ошибку?


person beli    schedule 19.03.2017    source источник
comment
вашему серверу нужен известный сертификат, известный java, который простирается от корневых сертификатов. вам нужен настоящий сертификат или вы должны импортировать в cacerts с помощью keytools. вы можете также включить отладку впоследствии, чтобы увидеть текущие ошибки.   -  person benchpresser    schedule 19.03.2017
comment
ваш фрагмент работал здесь (две машины с oracle java 8 u121 в одной сети). Пожалуйста, опишите вашу среду, и это ведение журнала может помочь: System.setProperty("javax.net.debug", "ssl");   -  person nandsito    schedule 19.03.2017
comment
@nandsito Моя среда выглядит следующим образом: на обоих компьютерах работает java 1.8.0_121, оба компьютера подключены к одной сети, оба работают под управлением Windows 10, на компьютере A работает сервер и клиент, клиент на компьютере A работает правильно, компьютер B работает clinet, и этот компьютер получает ошибку при подключении. Добавляю ссылку на копипаст: [ссылка] codepaste.net/fmyekg   -  person beli    schedule 19.03.2017
comment
возможно, это проблема HostnameVerifier/server_name/SNI. Две ссылки: stackoverflow .com/questions/41692736/ и stackoverflow.com/questions/30817934/   -  person nandsito    schedule 19.03.2017


Ответы (1)


Я решил свою проблему. Мое хранилище доверия и ключевой камень были в моих файлах проекта, но когда я скомпилировал его в исполняемую банку, я подумал, что хранилище доверия и хранилище ключей включены в эту исполняемую банку, к сожалению, это не так. Я решил это, поместив хранилище доверия и хранилище ключей в одну папку с исполняемой банкой.

Решение было очень простым, и вся проблема возникла из-за моей неопытности.

Спасибо за помощь.

person beli    schedule 20.03.2017