SSL auto-signé de l'acceptation sur Android
Comment puis-je accepter un certificat auto-signé en Java sur Android?
Un exemple de code, ce serait parfait.
J'ai cherché partout sur Internet et bien que certaines personnes prétendent avoir trouvé la solution, soit il ne fonctionne pas ou n'est pas un exemple de code pour le sauvegarder.
Vous devez vous connecter pour publier un commentaire.
J'ai cette fonctionnalité dans exchangeIt, qui se connecte à Microsoft exchange via WebDav. Voici un code pour créer un client http qui va se connecter à l'auto-signé cert via SSL:
La EasySSLSocketFactory est ici, et la EasyX509TrustManager est ici.
Le code pour exchangeIt est open source, et hébergé sur googlecode ici, si vous avez des questions. Je ne suis pas en train de le plus, mais le code devrait fonctionner.
Noter que depuis Android 2.2 le processus a changé un peu, afin de vérifier cette pour rendre le code ci-dessus.
IOException: SSL handshake failure: I/O error during system call, Broken pipe
2.2. Savez-vous un moyen de contourner cela?params.setParameter()
nécessaire ? Le troisième aura besoin d'utiliser HTTP 1.1Comme EJP correctement commenté, "les Lecteurs sont priés de noter que cette technique est radicalement d'insécurité. SSL n'est pas sûr, à moins qu'un utilisateur est authentifié. Voir la RFC 2246."
Cela dit, voici une autre façon, sans aucune des classes supplémentaires:
J'ai fait face à cette question hier, lors de la migration de notre société API RESTful HTTPS, mais à l'aide de certificats SSL auto-signés.
J'ai cherché partout, mais tous les "corriger", a marqué les réponses que j'ai trouvé se composait de la désactivation de la validation de certificat, clairement écrasant tous les sens du protocole SSL.
Je suis finalement venu à une solution:
Créer Des Locaux De Stockage Des Clés
Pour permettre à votre application de valider vos certificats auto-signés, vous devez fournir une coutume keystore avec les certificats d'une manière qui Android peuvent faire confiance à votre point de terminaison.
Le format de ces personnalisées des fichiers de clés est "BKS" de BouncyCastle, si vous avez besoin de la version 1.46 de BouncyCastleProvider que vous pouvez télécharger ici.
Vous avez également besoin de votre certificat auto-signé, je vais supposer que c'est nommée
self_cert.pem
.Maintenant la commande pour la création de votre fichier de clés est:
PATH_TO_KEYSTORE
pointe vers un fichier de votre fichier de clés sera créé. Il ne DOIT PAS EXISTER.PATH_TO_bcprov-jdk15on-146.jar.JAR
est le chemin d'accès pour le téléchargement .jar libary.STOREPASS
est votre nouvellement créé de mot de passe du fichier de clés.Copier le nouveau fichier de stockage des clés de
PATH_TO_KEYSTORE
àres/raw/certs.bks
(certs.bks est juste le nom du fichier; vous pouvez utiliser n'importe quel nom que vous voulez)Créer une clé dans
res/values/strings.xml
avecCréer un cette classe qui hérite
DefaultHttpClient
Maintenant il suffit d'utiliser une instance de
**MyHttpClient**
comme vous le feriez avec**DefaultHttpClient**
pour faire de votre HTTPS requêtes, et il va utiliser et de valider correctement vos certificats SSL auto-signés.self_cert.pem
, c'est le certificat d'auto-signature utilisé par le serveur ? Ou je vais devoir générer un nouveau pour mon application android? Et si c'est la génération de la nouvelle, comment mon serveur de confiance en elle? Existe-il des paramètres qui doit être le même dans les deux certificats auto-signés?Moins que j'ai loupé quelque chose, les autres réponses sur cette page sont DANGEREUX, et sont fonctionnellement équivalents à pas à l'aide de SSL à tous. Si vous faites confiance à des certificats auto-signés, sans procéder à d'autres vérifications pour s'assurer que les certificats sont ceux qui vous attendent, alors n'importe qui peut créer un certificat auto-signé et peut se faire passer pour votre serveur. À ce stade, vous n'avez aucune sécurité réelle.
La seulement façon légitime de le faire (sans écrire une pleine SSL pile) est à ajouter une ancre de confiance pour être dignes de confiance lors de la vérification du certificat du processus. Les deux impliquent de coder en dur la confiance d'ancrage certificat dans votre application et de l'ajouter à ce que ancres de confiance que le système d'exploitation (ou d'autre, vous ne serez pas en mesure de se connecter à votre site si vous obtenez un vrai certificat).
Je suis conscient de deux façons de le faire:
Créer un magasin de confiance tel que décrit à http://www.ibm.com/developerworks/java/library/j-customssl/#8
Créer une instance de X509TrustManager et remplacer le getAcceptedIssuers méthode retourne un tableau qui contient votre certificat:
Notez que ce code est entièrement testées et peuvent même ne pas compiler, mais devrait au moins vous orienter dans la bonne direction.
Brian Yarger réponse fonctionne sous Android 2.2 ainsi, si vous modifiez le plus grand createSocket surcharge de la méthode comme suit. Il m'a fallu un certain temps pour obtenir l'auto-signé Ssl de travail.
Sur Android,
HttpProtocolParams
accepteProtocolVersion
plutôt queHttpVersion
.@Chris - ce Détachement comme une réponse car je ne peux pas ajouter des commentaires (pas encore). Je me demandais si votre approche est censé fonctionner lors de l'utilisation d'une webView. Je n'arrive pas à le faire sur Android 2.3 - au lieu de cela, j'ai juste un écran blanc.
Après quelques recherches, je suis tombé sur ce solution simple pour le traitement des erreurs SSL dans une webView qui a fonctionné comme un charme pour moi.
Dans le gestionnaire j'ai vérifier pour voir si je suis dans un dev mode et gestionnaire d'appel.aller de l'avant(), sinon je le gestionnaire d'appel.annuler(). Cela me permet de faire du développement à l'encontre d'un auto-signé cert sur un site web local.