2 votes

Android - SSL/TLS et ECC (cryptographie à courbe elliptique)

Je développe une application Android qui communique avec un serveur web. Nous utilisons HTTPS pour cette communication et nous avons également un certificat client dans l'application Android pour l'authentification.

Nous avons créé des certificats SSL en utilisant ECC (ANSI x9.62) afin d'avoir des certificats très petits pour réduire le coût de transmission pendant le handshake.

Le code source de la communication est plus ou moins comme ceci :

InputStream keystoreIs = getResources().openRawResource(R.raw.client_bks);
KeyStore keystore = KeyStore.getInstance("BKS");
keystore.load(keystoreIs, KEYSTORE_PASSWORD);

SSLSocketFactory socketFactory = new SSLSocketFactory(keystore, KEYSTORE_PASSWORD,  keystore);
Scheme serverScheme = new Scheme("https", socketFactory, SERVER_PORT);
HttpClient httpclient = new DefaultHttpClient();
httpclient.getConnectionManager().getSchemeRegistry().register(iServerScheme);
HttpPost httppost = new HttpPost(SERVER_URL);
HttpResponse response = httpclient.execute(httppost);

Le problème est que lorsque nous essayons de nous connecter, nous avons des erreurs comme :

E/NativeCrypto(4744): Unknown error 5 during connect
W/System.err(4744): java.io.IOException: SSL handshake failure: I/O error during system call, Connection reset by peer
W/System.err(4744):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method)
W/System.err(4744):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:316)
W/System.err(4744):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:520)
W/System.err(4744):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:461)
W/System.err(4744):     at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93)
W/System.err(4744):     at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
W/System.err(4744):     at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
W/System.err(4744):     at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
W/System.err(4744):     at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
(...)

J'ai essayé de trouver un exemple avec ECC et SSL mais je n'ai rien trouvé. J'ai trouvé plusieurs articles sur le cryptage et la génération de paires de clés (par exemple http://nelenkov.blogspot.com/2011/12/using-ecdh-on-Android.html#!/2011/12/utiliser-ecdh-sur-automobile.html ) mais rien en rapport avec ce type d'erreurs SSL.

Nous apprécions tout commentaire. Merci d'avance !

1voto

davenpcj Points 3424

Android 7.0 par défaut SSLSocketFactory ne supporte pas toutes les courbes elliptiques connues d'OpenSSL/BoringSSL. Le handshake liste seulement secp256r1 dans le supported_curves dans l'Allo du client.

En SSLEngine La documentation ne mentionne même pas les courbes prises en charge.

Si le serveur ne peut pas accepter d'utiliser cette courbe, il ferme la connexion et la poignée de main échoue du côté client avec l'erreur d'E/S indiquée.

Chrome sur Android prend toutefois en charge 3 courbes communes, secp256r1 , secp384r1 y x25519 .

EDITAR

Je dois ajouter que l'extension du support des algorithmes de hachage de signature inclut ECDSA avec SHA1 à SHA512, donc il devrait être possible d'utiliser un certificat ECDSA du côté serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X