web-dev-qa-db-fra.com

Faire utiliser SSLEngine TLSv1.2 sur Android (4.4.2)?

Mes amis, j'espère qu'il y a quelque chose d'évident qui me manque, et j'espère que quelqu'un pourra faire la lumière. J'essaie de faire fonctionner TLSv1.2 dans un contexte SSL + NIO (en utilisant la bibliothèque AndroidAsync ), j'essaye donc de l'activer via un SSLEngine. Je peux exécuter du code comme ceci:

        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(null, null, null);
        String[] protocols = sslContext.getSupportedSSLParameters().getProtocols();
        for (String protocol : protocols) {
            Timber.d("Context supported protocol: " + protocol);
        }

        SSLEngine engine = sslContext.createSSLEngine();
        String[] supportedProtocols = engine.getSupportedProtocols();
        for (String protocol : supportedProtocols) {
            Timber.d("Engine supported protocol: " + protocol);
        }

Et je finis par voir ça sur logcat:

06-22 21:56:27.715    1117-1117/? D/XXX﹕ Context supported protocol: SSLv3
06-22 21:56:27.715    1117-1117/? D/XXX﹕ Context supported protocol: TLSv1
06-22 21:56:27.725    1117-1117/? D/XXX﹕ Context supported protocol: TLSv1.1
06-22 21:56:27.725    1117-1117/? D/XXX﹕ Context supported protocol: TLSv1.2
06-22 21:56:27.735    1117-1117/? D/XXX﹕ Engine supported protocol: TLSv1
06-22 21:56:27.745    1117-1117/? D/XXX﹕ Engine supported protocol: SSLv3

Bien sûr, si j'essaie de engine.setEnabledProtocols(new String[] { "TLSv1.2" }) j'obtiens une exception IllegalArgumentException "Le protocole TLSv1.2 n'est pas pris en charge."

Je peux voir que le contexte prétend prendre en charge TLSv1.2, mais le moteur que je crée à partir de ce contexte ne le fait pas? Que se passe t-il ici? Rien de cela ne change si j'utilise "TLS" au lieu de "TLSv1.2" dans la première ligne ci-dessus, btw.

Je suppose que cela pourrait avoir quelque chose à voir avec ce problème , et j'ai lu cette question (encore sans réponse) et articles comme celui-ci , mais ils ne semblent pas tout à fait arriver à point - les solutions que j'ai vues semblent toutes s'appuyer sur SSLSocket plutôt que SSLEngine.

Merci beaucoup pour toute connaissance que vous pouvez laisser tomber.

MISE À JOUR 23/06/14 10AMEDT

J'ai donc trouvé SSLEngine.setSSLParameters, Que j'espérais me laisser passer un paramètre SSL que j'avais obtenu de SSLContext.getSupportedSSLParameters(), mais quand j'appelle, j'obtiens une exception qui prétend que les suites de chiffrement ne le sont pas pris en charge, il semble donc que setSSLParameters () fasse exactement la même chose que setEnabledCipherSuites (), et le moteur est déjà dans un état où il ne reconnaît pas le protocole/les suites TLS 1.2 comme pris en charge.

21
Glen

Les documents Android API API indiquer correctement que TLSv1.2 n'est pris en charge que pour SSLEngine dans l'API niveau 20 ou supérieur (Lollipop) tandis que SSLSocket le prend en charge depuis le niveau 16.

L'utilisation de SSLSocket ou nécessitant l'API 20 n'était pas une option pour notre projet et ni l'un ni l'autre n'a changé le code du serveur pour autoriser TLSv1 ou SSLv3. Notre solution consistait à installer un nouveau fournisseur de sécurité à l'aide de Google Play Services :

    ProviderInstaller.installIfNeeded(getApplicationContext());

Cela donne effectivement à votre application accès à une version plus récente d'OpenSSL et Java Security Provider qui inclut la prise en charge de TLSv1.2 dans SSLEngine. Une fois le nouveau fournisseur installé, vous pouvez créer un SSLEngine qui prend en charge SSLv3 , TLSv1, TLSv1.1 et TLSv1.2 de la manière habituelle:

    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(null, null, null);
    SSLEngine engine = sslContext.createSSLEngine();

Ou vous pouvez restreindre les protocoles activés à l'aide de engine.setEnabledProtocols.

62
Wolfgang Profer

Essayez cette solution si vous utilisez okHttp. Solution pour activer TLSv1.2 sur Android 4.4

J'ai eu le même problème sur Android <5.0 (16 <= API <20). Grâce à vos messages, j'ai pu faire fonctionner cela, donc pour tous ceux qui arrivent ici, c'est la sortie au moment de la rédaction de cet article, j'utilise OkHttp 3.4.1.

Tags: impossible de trouver des protocoles acceptables, javax.net.ssl.SSLProtocolException: prise de contact SSL abandonnée:

4
AAnkit

Voici comment procéder avec AndroidAsync:

ProviderInstaller.installIfNeeded(context);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(KeyManager[] km, TrustManager[] tm, SecureRandom rm);
SSLEngine engine = sslContext.createSSLEngine();
AsyncHttpClient.getDefaultInstance().insertMiddleware((AsyncHttpClientMiddleware) engine); 

La mise à jour de SSLEngine et son insertion en tant que middleware dans AndroidAsync semble fonctionner.

3
Jordan Réjaud