Android Client / Serveur sur TLS v1.2
Je vais essayer mon pour créer TLS v1.2 la communication entre un serveur et un client android.
J'ai créé un TLS v1.0 connexion avec n'importe quel problème, mais je n'arrive pas v1.2.
C'est le serveur de code:
char[] passphrase = "myComplexPass1".toCharArray();
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(new FileInputStream("cacerts"), passphrase);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keystore, passphrase);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
SSLContext sslContext.init(keyManagers, null, null);
SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
sslServerSocket.setEnabledProtocols(new String [] { "TLSv1", "TLSv1.1", "TLSv1.2" });
sslServerSocket.setUseClientMode(false);
sslServerSocket.setWantClientAuth(false);
sslServerSocket.setNeedClientAuth(false);
sslSocket = (SSLSocket)sslServerSocket.accept();
alors que c'est le code de client:
char[] passphrase = "myComplexPass1".toCharArray();
KeyStore keystore = KeyStore.getInstance("BKS");
keystore.load(this.getApplicationContext().getResources().openRawResource(R.raw.jb), passphrase);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keystore, passphrase);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
Log.d("Context Protocol",sslContext.getProtocol());//this prints correctly TLS v1.2!
KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
TrustManager[] trustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
{
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
{
}
}
};
sslContext.init(keyManagers, trustManagers, new SecureRandom());
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) sslContext.getSocketFactory();
SSLSocket skt = (SSLSocket) sslSocketFactory.createSocket(HOST, PORT);
skt.setKeepAlive(true);
Client code, écrit en java client en cours d'exécution sur JRE7 sur mon pc, fonctionne parfaitement et je vois avec getProtocol (côté serveur) TLSv1.2 avec un bon chiffre, pris en charge par tlsv1.2.
Même code sur android faire un tlsv1.0 connexion!
Vraiment, je ne comprends pas.
Sur Java client JRE7 œuvres, sur android SEULEMENT tlsv1.0
Toute suggestion?
C'est ma première question, j'ai beaucoup cherché. Probablement ma mise en forme n'est pas correcte 🙁
Merci, mais d'après ce lien il devrait être pris en charge. Je suis sous android 4.2.2
OriginalL'auteur Guido Davide | 2013-05-13
Vous devez vous connecter pour publier un commentaire.
Genre de tard pour répondre à cela, mais peut-être que quelqu'un d'autre aura besoin d'une réponse.
J'ai couru dans la même question. Peu importe si vous fournissez TLSv1.2 de la
SSLContext.init()
méthode, certaines versions d'Android que j'ai essayé de ne pas activer TLS 1.2. Vous devez permettre à votre client socket en utilisantsetEnabledProtocols()
comme vous le faites pour votre serveur de socket. Pour moi, je l'ai fait en une coutumeSSLSocketFactory
j'ai créé:À partir de developer.android.com/reference/javax/net/ssl/SSLSocket.html, TLS 1.2 est uniquement pris en charge pour l'API versions 16+.
Cela a sauvé ma journée. C'est bizarre parfois, la façon dont Android fait ce genre de trucs, mais merci, beaucoup.
OriginalL'auteur BJV