У меня ошибка при попытке передать данные int с сервера на клиент по SSLSocket. Ошибки: Сервер:
javax.net.ssl.SSLException: Connection reset
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:127)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:320)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:263)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:258)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:137)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1180)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1091)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:721)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:804)
at java.base/java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2745)
at java.base/java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2761)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3258)
at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:873)
at java.base/java.io.ObjectInputStream.<init>(ObjectInputStream.java:350)
at SocketUtilities.receiveSongList(SocketUtilities.java:53)
at MusicControl.doPost(MusicControl.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
receiveddd?
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:835)
Suppressed: java.net.SocketException: Connection reset by peer: socket write error
at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)
at java.base/sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:351)
... 39 more
Caused by: java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:448)
at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:165)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:108)
... 36 more
Ошибка клиента:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: no cipher suites in common
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:306)
at sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:1127)
at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:814)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:221)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:750)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:247)
at com.company.SongsList.sendSongList(SongsList.java:38)
at com.company.Main.main(Main.java:23)
Я создаю два приложения, подключенных через SSLSocket. У меня ошибка при передаче int данных с сервера do client. Сервер: это сервер Tomcat 9, конфигурация по умолчанию с сертификатом SSL (сгенерированный мной самим с помощью keytool). Кажется, SSL настроен правильно, потому что я могу зайти на свою страницу JSP по https и по правильному порту. Клиент - это проект Java с импортированным server.cer, который был экспортирован из моего файла keytool, сертификат, кажется, доступен в проекте:
>xx: keytool -list
>Enter keystore password:
>Keystore type: PKCS12
>Keystore provider: SUN
>Your keystore contains 1 entry
>tomcat, 29 paź 2019, PrivateKeyEntry,
>Certificate fingerprint (SHA-256): AC:9B:46...
Я использую указанный порт (8443) в файле конфигурации Tomcat для SSL,Я захожу в сеть через другой порт: 8080 (чтобы не блокировать 8443)
Я пытался: перечисление всех комплектов шифров с обеих сторон Программно рукопожатие (без эффекта) Проверено txt сертификата на наличие дополнительных пробелов
Понятия не имею, что делать дальше
Код сервера:
public void sendOrder(int orderNumber) {
try {
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
System.out.println("create socket sendorder");
SSLSocket s = (SSLSocket) sslsocketfactory.createSocket("xxx.xxx.xx.xx", xxxx);
String[] cs = s.getEnabledCipherSuites();
for (String c : cs){
System.out.println(c);
}
s.startHandshake();
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
System.out.println("write order");
dout.writeInt(orderNumber);
s.close();
//sslsocketfactory.
} catch (Exception e) {
System.out.println("Send order: " + e);
}
}
Код на стороне клиента:
public int receiveOrder() throws Exception {
int orderReceived = 0;
SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(xxxx);
String[] cs = sslServerSocket.getEnabledCipherSuites();
for (String c : cs){
System.out.println(c);
}
SSLSocket s = (SSLSocket) sslServerSocket.accept();
DataInputStream dis = new DataInputStream(s.getInputStream());
orderReceived = (Integer) dis.readInt();
sslServerSocket.close();
return orderReceived;
}
Что я делаю не так? Согласно учебникам у меня есть все, что нужно: сервер SSL, сертификат и код. Чего не хватает?
Я ищу простой и полный учебник / способ отправки данных (int, object) между двумя приложениями. Я был бы признателен за любую помощь с SSLSockets или другой способ передачи данных.