J'essaye d'exécuter le code suivant dans Android
URLConnection l_connection = null;
// Create connection
uzip=new UnZipData(mContext);
l_url = new URL(serverurl);
if ("https".equals(l_url.getProtocol())) {
System.out.println("<<<<<<<<<<<<< Before TLS >>>>>>>>>>>>");
sslcontext = SSLContext.getInstance("TLS");
System.out.println("<<<<<<<<<<<<< After TLS >>>>>>>>>>>>");
sslcontext.init(null,
new TrustManager[] { new CustomTrustManager()},
new java.security.SecureRandom());
HttpsURLConnection
.setDefaultHostnameVerifier(new CustomHostnameVerifier());
HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext
.getSocketFactory());
l_connection = (HttpsURLConnection) l_url.openConnection();
((HttpsURLConnection) l_connection).setRequestMethod("POST");
} else {
l_connection = (HttpURLConnection) l_url.openConnection();
((HttpURLConnection) l_connection).setRequestMethod("POST");
}
/*System.setProperty("http.agent", "Android_Phone");*/
l_connection.setConnectTimeout(10000);
l_connection.setRequestProperty("Content-Language", "en-US");
l_connection.setUseCaches(false);
l_connection.setDoInput(true);
l_connection.setDoOutput(true);
System.out.println("<<<<<<<<<<<<< Before Connection >>>>>>>>>>>>");
l_connection.connect();
Sur l_connection.connect()
, il donne cette SSLhandshakeException. Parfois cela fonctionne, mais la plupart du temps, cela fait exception. Cela ne se produit que sur l'émulateur Android 4.0. Je l'ai testé sur Android 4.4 et 5.0, cela fonctionne très bien. Quelle pourrait en être la cause? Veuillez aider
TRACE DE LA PILE
04-28 15:51:13.143: W/System.err(2915): javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x870c918: Failure in SSL library, usually a protocol error
04-28 15:51:13.143: W/System.err(2915): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:658 0xb7c393a1:0x00000000)
04-28 15:51:13.143: W/System.err(2915): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:460)
04-28 15:51:13.143: W/System.err(2915): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
04-28 15:51:13.143: W/System.err(2915): at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
04-28 15:51:13.143: W/System.err(2915): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477)
04-28 15:51:13.153: W/System.err(2915): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:441)
04-28 15:51:13.153: W/System.err(2915): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
04-28 15:51:13.153: W/System.err(2915): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
04-28 15:51:13.153: W/System.err(2915): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
04-28 15:51:13.153: W/System.err(2915): at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:164)
04-28 15:51:13.153: W/System.err(2915): at com.ofss.fcdb.mobile.android.rms.helpers.NetworkConnector.getConnection(NetworkConnector.java:170)
04-28 15:51:13.153: W/System.err(2915): at com.ofss.fcdb.mobile.android.rms.util.InitiateRMS$2.run(InitiateRMS.java:221)
04-28 15:51:13.153: W/System.err(2915): at java.lang.Thread.run(Thread.java:856)
04-28 15:51:13.153: W/System.err(2915): Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x870c918: Failure in SSL library, usually a protocol error
04-28 15:51:13.153: W/System.err(2915): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:658 0xb7c393a1:0x00000000)
04-28 15:51:13.153: W/System.err(2915): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
04-28 15:51:13.153: W/System.err(2915): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
04-28 15:51:13.153: W/System.err(2915): ... 11 more
04-28 16:42:44.139: W/ResourceType(3140): No package identifier when getting value for resource number 0x00000000
android
ssl
sslhandshakeexception
android-4.0.3-ice-cream-sandwich
Bhavit S. Sengar
la source
la source
Réponses:
J'ai trouvé la solution en analysant les paquets de données à l'aide de WireShark. Ce que j'ai trouvé, c'est qu'en établissant une connexion sécurisée, Android revenait à SSLv3 à partir de TLSv1 . Il s'agit d'un bogue dans les versions Android <4.4, et il peut être résolu en supprimant le protocole SSLv3 de la liste des protocoles activés. J'ai créé une classe socketFactory personnalisée appelée NoSSLv3SocketFactory.java. Utilisez ceci pour créer une socketfactory.
Utilisez cette classe comme ceci lors de la connexion:
METTRE À JOUR :
Désormais, la solution correcte serait d'installer un fournisseur de sécurité plus récent à l'aide des services Google Play :
Cela donne efficacement à votre application l'accès à une version plus récente d'OpenSSL et du fournisseur de sécurité Java, 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:
Ou vous pouvez restreindre les protocoles activés en utilisant
engine.setEnabledProtocols
.N'oubliez pas d'ajouter la dépendance suivante ( vérifiez la dernière version ici ):
Pour plus d'informations, consultez ce lien .
la source
Scénario
Je recevais des exceptions SSLHandshake sur les appareils exécutant des versions d'Android antérieures à Android 5.0. Dans mon cas d'utilisation, je voulais également créer un TrustManager pour faire confiance à mon certificat client.
J'ai implémenté NoSSLv3SocketFactory et NoSSLv3Factory pour supprimer SSLv3 de la liste des protocoles pris en charge par mon client, mais je n'ai pu faire fonctionner aucune de ces solutions.
Certaines choses que j'ai apprises:
Ce qui a fonctionné pour moi
Autorisez la
Provider
mise à jour de la sécurité d' Android lors du démarrage de votre application.Le fournisseur par défaut avant 5.0+ ne désactive pas SSLv3. À condition que vous ayez accès aux services Google Play, il est relativement simple de patcher le fournisseur de sécurité d'Android depuis votre application.
Si vous créez maintenant votre OkHttpClient ou HttpURLConnection, TLSv1.1 et TLSv1.2 doivent être disponibles en tant que protocoles et SSLv3 doit être supprimé. Si le client / connexion (ou plus spécifiquement SSLContext) a été initialisé avant l'appel,
ProviderInstaller.installIfNeeded(...)
il devra être recréé.N'oubliez pas d'ajouter la dépendance suivante ( dernière version trouvée ici ):
Sources:
De côté
Je n'avais pas besoin de définir explicitement les algorithmes de chiffrement que mon client devrait utiliser, mais j'ai trouvé un article de SO recommandant ceux considérés comme les plus sécurisés au moment de la rédaction: Quelles suites de chiffrement activer pour SSL Socket?
la source
Vous devez également savoir que vous pouvez forcer TLS v1.2 pour les appareils Android 4.0 qui ne l'ont pas activé par défaut:
Mettez ce code dans onCreate () de votre fichier d'application :
la source
Auparavant, j'ai également résolu ce problème avec une
SSLFactory
implémentation personnalisée , mais selon la documentation d'OkHttp, la solution est beaucoup plus simple.Ma solution finale avec les
TLS
chiffrements nécessaires pour les appareils 4.2+ ressemble à ceci:Notez que l'ensemble des protocoles pris en charge dépend de la configuration de votre serveur.
la source
J'ai trouvé la solution ici dans ce lien .
Il vous suffit de placer le code ci-dessous dans votre classe d'application Android. Et cela suffit. Vous n'avez pas besoin de modifier vos paramètres de modernisation. Cela m'a sauvé la journée.
J'espère que cela vous aidera. Je vous remercie.
la source
Cela a résolu le problème pour moi:
Android 4.1. activer tls1.1 et tls 1.2
la source
J'ai aussi ce problème de rapport d'erreur. Mon code est ci-dessous.
J'ai mon Springboot comme backend et j'utilise Android OKHttp pour obtenir des informations. L'erreur critique que j'ai faite est que j'utilise un .url ( "https : //10.0.2.2: 8010 / getShopInfo / aaa") dans le code d'Android. Mais mon backend n'est pas autorisé à la demande https. Après avoir utilisé .url (" http : //10.0.2.2: 8010 / getShopInfo / aaa") , mon code s'est bien passé. Donc, je veux dire que mon erreur n'est pas la version de l'émulateur, mais le protocole de requête. Je rencontre un autre problème après avoir fait ce que j'ai dit, mais c'est un autre problème, et j'attache la méthode de résolution du nouveau problème .
Bonne chance! GUY!
la source
Il n'était reproductible que lorsque j'utilise un proxy sur genymotion (<4,4).
Vérifiez vos paramètres de proxy dans Paramètres-> Sans fil et réseaux-> WiFi -> (Appuyez longuement sur WiredSSID) -> Modifier le réseau
Sélectionnez Afficher les options avancées: définissez les paramètres du proxy sur AUCUN.
la source
Lorsque j'ai eu cette erreur, c'était parce que les protocoles (versions TLS) et / ou les suites de chiffrement pris en charge par le serveur n'étaient pas activés (et peut-être même pas pris en charge par) l'appareil. Pour l'API 16-19, TLSv1.1 et TLSv1.2 sont pris en charge mais pas activés par défaut. Une fois que je les ai activés pour ces versions, j'ai toujours l'erreur car ces versions ne prennent en charge aucun des chiffrements sur notre instance d'AWS CloudFront.
Comme il n'est pas possible d'ajouter des chiffrements à Android, nous avons dû faire passer notre version CloudFront de TLSv1.2_2018 à TLSv1.1_2016 (qui prend toujours en charge TLSv1.2; il n'en a tout simplement pas besoin), qui a quatre des chiffrements pris en charge par les versions antérieures d'Android, dont deux sont toujours considérées comme fortes.
À ce stade, l'erreur a disparu et les appels ont été traités (avec TLSv1.2) car il y avait au moins un protocole et au moins un chiffrement que le périphérique et le serveur partageaient.
Reportez-vous aux tableaux de cette page pour voir quels protocoles et chiffrements sont pris en charge et activés sur quelles versions d'Android.
Maintenant, Android essayait-il vraiment d'utiliser SSLv3 comme l'implique la partie "échec de la poignée de main d'alerte sslv3" du message d'erreur? J'en doute; Je soupçonne que c'est une vieille toile d'araignée dans la bibliothèque SSL qui n'a pas été nettoyée mais je ne peux pas le dire avec certitude.
Afin d'activer TLSv1.2 (et TLSv1.1), j'ai pu utiliser un fichier beaucoup plus simple
SSLSocketFactory
que ceux vus ailleurs (commeNoSSLv3SocketFactory
). Il s'assure simplement que les protocoles activés incluent tous les protocoles pris en charge et que les chiffrements activés incluent tous les chiffrements pris en charge (ce dernier n'était pas nécessaire pour moi mais cela pourrait l'être pour d'autres) - voirconfigure()
en bas. Si vous préférez n'activer que les derniers protocoles, vous pouvez remplacersocket.supportedProtocols
par quelque chose commearrayOf("TLSv1.1", "TLSv1.2")
(de même pour les chiffrements):la source
J'ai résolu le problème par ceci: NoSSLv3SocketFactory.java
Classe principale:
la source
Ma réponse est proche des réponses ci-dessus, mais vous devez écrire la classe exactement sans rien changer.
}
et de l'utiliser avec HttpsURLConnection
la source