2017-04-03 3 views
2

Ich arbeite an einem Gerät mit Android 4.4 (API Level 19). Aber ich muss eine Anwendung entwickeln, die mit einem Server verbindet, der nur TLSv1.2 und Verschlüsselung von SHA256 unterstützt. Ich habe versucht, den SSL-Kontext mit der Legacy-Apache-Bibliothek und dem aktualisierten Apache 4.4.1.2 (cz.msebera.android) zu erstellen. Nach dem Erstellen des Kontexts und ich bekomme die unterstützte Chiffre, nichts von ihnen enthält SHA256. Das Programm läuft auf anderen Android 5.0 + Geräten einwandfrei.Kann Android 4.4 Verschlüsselung mit SHA256 unterstützen?

Meine Frage ist, dass ich TLSv1.2 und Chiffre SHA256 auf einem Android 4.4 Gerät unterstützen kann?

Danke.

Antwort

0

Schließlich I das Problem gelöst durch meine eigene SSL-Fabrik wie folgt zu erstellen:

package com.bbpos.www.payment_gp.webservice; 

public class NoSSLv3SocketFactory extends SSLSocketFactory { 
private final SSLSocketFactory delegate; 

public NoSSLv3SocketFactory() { 
    this.delegate = HttpsURLConnection.getDefaultSSLSocketFactory(); 
} 

public NoSSLv3SocketFactory(SSLSocketFactory delegate) { 
    this.delegate = delegate; 
} 

@Override 
public String[] getDefaultCipherSuites() { 
    return delegate.getDefaultCipherSuites(); 
} 

@Override 
public String[] getSupportedCipherSuites() { 
    return delegate.getSupportedCipherSuites(); 
} 

private Socket makeSocketSafe(Socket socket) { 
    if (socket instanceof SSLSocket) { 
     String[] protocols = { 
       "TLSv1.1", 
       "TLSv1.2" 
     }; 
     ((SSLSocket) socket).setEnabledProtocols(protocols); 
    } 
    return socket; 
} 

@Override 
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { 
    return makeSocketSafe(delegate.createSocket(s, host, port, autoClose)); 
} 

@Override 
public Socket createSocket(String host, int port) throws IOException { 
    return makeSocketSafe(delegate.createSocket(host, port)); 
} 

@Override 
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { 
    return makeSocketSafe(delegate.createSocket(host, port, localHost, localPort)); 
} 

@Override 
public Socket createSocket(InetAddress host, int port) throws IOException { 
    return makeSocketSafe(delegate.createSocket(host, port)); 
} 

@Override 
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { 
    return makeSocketSafe(delegate.createSocket(address, port, localAddress, localPort)); 
} 

} 

Und dann die Fabrik am Anfang des Programms initialisiert werden:

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 

     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[0]; 
     } 

     public void checkClientTrusted(java.security.cert.X509Certificate[] certs, 
             String authType) { 
     } 

     public void checkServerTrusted(java.security.cert.X509Certificate[] certs, 
             String authType) { 
     } 
    }}; 
    try { 
     SSLContext sc; 
     sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(sc.getSocketFactory()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(NoSSLv3Factory); 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }); 

    } catch (Exception e) 
    { 

    } 
+0

Wie löst das Ihr Problem? Alles, was Sie tun, ist TLS 1.1 und 1.2 zu aktivieren, aber Sie delegieren die 'get * CipherSuites()' an eine Standard-SSL-Socket-Factory, die immernoch nur SHA1-Chiffren zurückgibt, was Ihr ursprüngliches Problem war – Hilikus

1

... mit Android 4.4 (API-Ebene 19)

Nach den documentation of SSLSocket beliebigen Chiffren mit SHA-256 als HMAC da Level-API nur verfügbar ist, 20

Verwandte Themen