Java:SSLHandshakeException ( Android, Samsung S6 )



  • Hallo,

    in meinem Code finden sich folgende Zeilen

    mSSLContext = SSLContext.getInstance("TLS");
    
    mSSLContext.init(null, trustAllCerts, null); //new java.security.SecureRandom());
    
    mSSLSocketFactory = mSSLContext.getSocketFactory();
    
    networkSocket = (SSLSocket)mSSLSocketFactory.createSocket(networkSocket, mHost, mPort, true);
    
    ((javax.net.ssl.SSLSocket)networkSocket).addHandshakeCompletedListener(new MyHandshakeListener());
    
    ((javax.net.ssl.SSLSocket)networkSocket).startHandshake();  <= Fehler / Exception         
    
    networkSocket.getOutputStream().flush();
    

    Es wird ein Socket ("networkSocket") erstellt ( nicht im Codeabschnitt enthalten ) und mit Hilfe diesem ein SSL-Socket erzeugt.

    Der dargestellte Code arbeitet bisher auf allen Geräten ab Android 2.2 ( ... ) bis 5.1.1 ( z.B. Sony D6503 ) die wahlfrei verwendet

    wurden ohne Probleme. Mit dem Samsung S6 jedoch, wird ein Handshake-Error ausgegeben. Da ich selbst über kein S6 verfüge

    und der konkrete Fehlertext erst mir zugesendet werden kann nachdem eine verschlüsselte Verbindung hergestellt werden konnte,

    bin ich auf die Aussagen der Anwender angewiesen. Das verwendete Zertifikat ist selbst signiert mit 1024bit.

    Auf meiner Suche nach einer möglichen Ursache fand ich: Android 5.1 Changelog is Official

    Die Änderungen müssten dann aber auch in dem genannten Sony Gerät enthalten sein, welches kein Fehler meldet.

    Was ist anders am Samsung S6 ? Ist überhaupt was anders ? ( herstellerspezifisches bezüglich Security )

    Edit:
    Heute habe ich ein S6 und den StackTrace zur Ausnahme

    E/TCP(25160): S: Error: SSLHandshakeException := Handshake failed
    E/TCP(25160): javax.net.ssl.SSLHandshakeException: Handshake failed
    E/TCP(25160): at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:408)
    E/TCP(25160): at mysql.MySQL.login(MySQL.java:5570)
    E/TCP(25160): at mysql.MySQL.synchronize_0800(MySQL.java:3658)
    E/TCP(25160): at mysql.MySQL.run(MySQL.java:3833)
    E/TCP(25160): Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x7fb1896180: Failure in SSL library, usually a protocol error
    E/TCP(25160): error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:got Channel ID before a ccs (external/openssl/ssl/s3_clnt.c:3651 0x7fa49ab4b0:0x00000000)
    E/TCP(25160): at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
    E/TCP(25160): at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:336)

    Mit einem Sony D6503 ( Android 5.1.1 ) funktioniert alles wunderbar. Ebenso im Emulator ...

    Die Fehlermeldung findet sich im SourceCode, welch Überraschung 🙂

    https://code.google.com/p/gentroid/source/browse/dev-libs/openssl/files/0004-channelid.patch?spec=svn.portage.7c9c7c374f0ca91530bc29baa9dcb5e8862cdae0&repo=portage&r=7c9c7c374f0ca91530bc29baa9dcb5e8862cdae0

    +{ERR_REASON(SSL_R_GOT_CHANNEL_ID_BEFORE_A_CCS),"got Channel ID before a ccs"},

    Aber was sagt mir das genau. Könnte es sein, ich muss ein neues Zertifikat erstellen ?

    Erstellt wurde das selbstsignierte Zertifikat mit ... -newkey rsa:2048

    Die Website, welche mit selben Zertifikat arbeitet, kann geöffnet werden.
    ( mit entsprechender Meldung, unsicher - selbstsigniertes Zertifikat )

    Ich suche zwar intensiv ...
    https://secure-resumption.com/tlsauth.pdf

    ... eine Idee für eine mögliche Ursache habe ich aber noch nicht.
    Momentan kann ich auch nicht mit WireShark prüfen was die Unterschiede
    während des Handshake sind. 😕


Log in to reply