Ошибка соединения SSLSocket при отправке данных: handshake_failure и никаких общих наборов шифров - PullRequest
0 голосов
/ 01 ноября 2019

У меня ошибка при попытке передать данные 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 или другой способ передачи данных.

...