Comment remplacer la liste de chiffrement envoyée au serveur par Android lors de l'utilisation de HttpsURLConnection?
Au cours de la négociation TLS, les clients envoient une liste d'algorithmes pour le serveur, le serveur choisit un, et que le chiffrement ne commence. Je veux changer ce cipherlist envoyé au serveur par Android, quand je suis en utilisant HttpsURLConnection
pour la communication.
Je sais que je peux utiliser setSSLSocketFactory
sur le HttpsURLConnection
objet de le configurer pour utiliser un SSLSocketFactory
. Ceci est utile lorsque je veux changer le trustmanager etc utilisés par les SSLSocket
renvoyé par la SSLSocketFactory
.
Je sais qu'en général cette ciphersuite liste peut être modifiée à l'aide d'un SSLParameters
objet et le passer à SSlsocket
ou SSLEngine
des objets en utilisant les méthodes qu'ils fournissent.
MAIS la SSLSocketFactory
ne semble pas exposer de telles méthodes!
Je ne peux pas trouver un moyen de changer le SSLParameters
de retour de la SSLSocket
les objets créés par la SSLSocketFactory
je passe à HttpsURLConnection
.
Que faire?
Je suppose que c'est également pertinente pour Java en général, pas seulement Android. Peut-être il ya un OO façon de le faire (par exemple, étendre SSLSocketFactory
et qui fournissent HttpsURLConnection
?)
source d'informationauteur AndroidSec
Vous devez vous connecter pour publier un commentaire.
Ce morceau de code est un peu brute. a utiliser avec précaution.
Lorsque vous voulez l'utiliser.
Merci à vous.
J'ai livré la technique dans @ThinkChris la réponse deUn dans un simple appel de méthode. Vous pouvez utiliser le NetCipher bibliothèque pour obtenir un moderne TLS config lors de l'utilisation d'Android
HttpsURLConnection
. NetCipher configure leHttpsURLConnection
exemple, d'utiliser les meilleures prises en charge TLS version, supprime SSLv3 de soutien, et configure la meilleure suite d'algorithmes pour que le protocole TLS version. Tout d'abord, l'ajouter à votre construire.gradle:Ou vous pouvez télécharger le netcipher-1.2.jar et de l'inclure directement dans votre application. Alors au lieu de l'appeler:
Appeler cela:
Si vous voulez spécifiquement de personnaliser cette liste de chiffrement, vous pouvez vérifier le code. Mais la plupart des gens ne devraient pas avoir à penser à la liste de chiffrement, il devrait plutôt utiliser le commun des meilleures pratiques par défaut.
Ce code a fait des merveilles pour un imprévu
javax.net.ssl.SSLHandshakeException
.La mise à niveau vers
jdk1.8.0_92
et Oracle JCE force illimitée de la politique de fichiers n'a pas aidé, et je n'arrivais pas à essayer d'appliquer certainesSSLParameters
à laHttpsUrlConnection
.En particulier, la tentative d'utilisation
HttpsUrlConnection
à lirehttps://www.adrbnymellon.com
résultats dans l'erreur suivante:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Ce site OK travaillé avant sur 4/15/2016, puis a commencé à échouer. Je crois que la panne est causée par le site web de l'arrêt de l'appui pour
SSLv2Hello
etSSLv3
en raison de la NOYER vulnérabilité. Voir cette pour une excellente analyse.L'accès au site a commencé à travailler en modifiant le code avec les modifications apportées à seulement 2 constantes:
J'espère que cela aide quelqu'un d'autre.