J'essaie d'établir des connexions HTTPS, en utilisant HttpClient
lib, mais le problème est que, puisque le certificat n'est pas signé par une autorité de certification reconnue (CA) comme Verisign , GlobalSIgn , etc., répertoriée sur l'ensemble des certificats de confiance Android, Je continue à avoir javax.net.ssl.SSLException: Not trusted server certificate
.
J'ai vu des solutions où vous acceptez simplement tous les certificats, mais que faire si je veux demander à l'utilisateur?
Je souhaite obtenir une boîte de dialogue similaire à celle du navigateur, laissant l'utilisateur décider de continuer ou non. Je souhaite de préférence utiliser le même magasin de certificats que le navigateur. Des idées?
Réponses:
La première chose à faire est de définir le niveau de vérification. De tels niveaux ne sont pas tant:
Bien que la méthode setHostnameVerifier () soit obsolète pour la nouvelle bibliothèque apache, mais pour la version du SDK Android, c'est normal. Et donc nous prenons
ALLOW_ALL_HOSTNAME_VERIFIER
et le plaçons dans l'usine de méthodesSSLSocketFactory.setHostnameVerifier()
.Ensuite, vous devez définir notre usine pour le protocole sur https. Pour ce faire, appelez simplement la
SchemeRegistry.register()
méthode.Ensuite, vous devez créer un
DefaultHttpClient
avecSingleClientConnManager
. Également dans le code ci-dessous, vous pouvez voir que par défaut, nous utiliserons également notre drapeau (ALLOW_ALL_HOSTNAME_VERIFIER
) par la méthodeHttpsURLConnection.setDefaultHostnameVerifier()
Le code ci-dessous fonctionne pour moi:
la source
org.apache.http.conn.ssl.SSLSocketFactory
pourquoi je veux utiliserjavax.net.ssl.HttpsURLConnection
??Les étapes principales suivantes sont nécessaires pour établir une connexion sécurisée à partir des autorités de certification qui ne sont pas considérées comme approuvées par la plate-forme Android.
Comme demandé par de nombreux utilisateurs, j'ai reproduit les parties les plus importantes de mon article de blog ici:
java.net.ssl.HttpsURLConnection
(plus facile à comprendre, plus performant)Prenez les certificats
Vous devez obtenir tous les certificats qui créent une chaîne à partir du certificat de point de terminaison jusqu'à la racine CA. Cela signifie, tous les certificats de l'autorité de certification intermédiaire (le cas échéant) ainsi que le certificat de l'autorité de certification racine. Vous n'avez pas besoin d'obtenir le certificat de point de terminaison.
Créer le keystore
Téléchargez le fournisseur BouncyCastle et stockez-le dans un emplacement connu. Assurez-vous également que vous pouvez appeler la commande keytool (généralement située sous le dossier bin de votre installation JRE).
Importez maintenant les certificats obtenus (n'importez pas le certificat de point de terminaison) dans un magasin de clés au format BouncyCastle.
Je ne l'ai pas testé, mais je pense que l'ordre d'importation des certificats est important. Cela signifie que vous importez d'abord le certificat de l'autorité de certification intermédiaire le plus bas, puis jusqu'au certificat de l'autorité de certification racine.
Avec la commande suivante, un nouveau keystore (s'il n'est pas déjà présent) avec le mot de passe mysecret sera créé et le certificat de CA intermédiaire sera importé. J'ai également défini le fournisseur BouncyCastle, où il peut être trouvé sur mon système de fichiers et le format de keystore. Exécutez cette commande pour chaque certificat de la chaîne.
Vérifiez si les certificats ont été correctement importés dans le fichier de clés:
Devrait afficher toute la chaîne:
Vous pouvez maintenant copier le keystore en tant que ressource brute dans votre application Android sous
res/raw/
Utilisez le keystore dans votre application
Tout d'abord, nous devons créer un Apache HttpClient personnalisé qui utilise notre keystore pour les connexions HTTPS:
Nous avons créé notre HttpClient personnalisé, maintenant nous pouvons l'utiliser pour des connexions sécurisées. Par exemple, lorsque nous faisons un appel GET à une ressource REST:
C'est tout ;)
la source
/res/raw/mykeystore.bks
, bien que incapable de résoudre la référence à cela. comment résoudre ça?Si vous disposez d'un certificat personnalisé / auto-signé sur le serveur qui n'est pas présent sur l'appareil, vous pouvez utiliser la classe ci-dessous pour le charger et l'utiliser côté client sous Android:
Placez le
*.crt
fichier de certificat/res/raw
afin qu'il soit disponible à partir deR.raw.*
Utilisez la classe ci-dessous pour obtenir un
HTTPClient
ouHttpsURLConnection
qui aura une fabrique de sockets utilisant ce certificat:Points clés:
Certificate
les objets sont générés à partir de.crt
fichiers.KeyStore
est créée.keyStore.setCertificateEntry("ca", cert)
ajoute un certificat au magasin de clés sous l'alias "ca". Vous modifiez le code pour ajouter plus de certificats (CA intermédiaire, etc.).SSLSocketFactory
qui peut ensuite être utilisé parHTTPClient
ouHttpsURLConnection
.SSLSocketFactory
peut être configuré davantage, par exemple pour ignorer la vérification du nom d'hôte, etc.Plus d'informations sur: http://developer.android.com/training/articles/security-ssl.html
la source
.crt
fichiers ou télécharger à partir d'un serveur?J'étais frustré d'essayer de connecter mon application Android à mon service RESTful en utilisant https. J'étais également un peu ennuyé par toutes les réponses suggérant de désactiver complètement la vérification des certificats. Si vous le faites, quel est l'intérêt de https?
Après avoir googlé le sujet pendant un moment, j'ai finalement trouvé cette solution où les jars externes ne sont pas nécessaires, juste les API Android. Merci à Andrew Smith, qui l'a publié en juillet 2014
Cela a bien fonctionné pour mon application de maquette.
la source
import java.security.cert.X509Certificate;
La meilleure réponse n'a pas fonctionné pour moi. Après quelques recherches, j'ai trouvé les informations requises sur "Android Developer": https://developer.android.com/training/articles/security-ssl.html#SelfSigned
La création d'une implémentation vide de X509TrustManager a fait l'affaire:
Veuillez noter que cette implémentation vide de TustManager n'est qu'un exemple et son utilisation dans un environnement productif entraînerait une grave menace pour la sécurité!
la source
Google recommande l'utilisation d' Android Volley pour les connexions HTTP / HTTPS , car cela
HttpClient
est obsolète. Donc, vous connaissez le bon choix :).Et aussi, JAMAIS les certificats SSL NUKE (JAMAIS !!!).
Nuke SSL Certificates, est totalement contraire à l'objectif de SSL, qui est de promouvoir la sécurité . Il n'y a aucun sens d'utiliser SSL, si vous prévoyez de bombarder tous les certificats SSL qui viennent. Une meilleure solution serait de ne pas utiliser SSL, ou une meilleure solution serait de créer une personnalisation
TrustManager
sur votre application + en utilisant Android Volley pour les connexions HTTP / HTTPS.Voici un Gist que j'ai créé, avec une LoginApp de base, effectuant des connexions HTTPS, en utilisant un certificat auto-signé côté serveur, accepté sur l'application.
Voici également un autre élément essentiel qui peut vous aider, pour créer des certificats SSL auto-signés pour la configuration sur votre serveur et également utiliser le certificat sur votre application. Très important: vous devez copier le fichier .crt qui a été généré par le script ci-dessus, dans le répertoire "raw" de votre projet Android.
la source
Voici comment vous pouvez ajouter des certificats supplémentaires à votre KeyStore pour éviter ce problème: Approuver tous les certificats à l'aide de HttpClient sur HTTPS
Cela n'invitera pas l'utilisateur comme vous le demandez, mais cela réduira la probabilité que l'utilisateur rencontre une erreur "Certificat de serveur non approuvé".
la source
Le moyen le plus simple de créer un certificat SSL
Ouvrez Firefox (je suppose que c'est également possible avec Chrome, mais c'est plus facile pour moi avec FF)
Visitez votre site de développement avec un certificat SSL auto-signé.
Cliquez sur le certificat (à côté du nom du site)
Cliquez sur "Plus d'informations"
Cliquez sur "Afficher le certificat"
Cliquez sur "Détails"
Cliquez sur "Exporter ..."
Choisissez "Certificat X.509 avec chaîne (PEM)", sélectionnez le dossier et le nom pour l'enregistrer et cliquez sur "Enregistrer"
Accédez à la ligne de commande, dans le répertoire où vous avez téléchargé le fichier pem et exécutez "openssl x509 -inform PEM -outform DM -in .pem -out .crt"
Copiez le fichier .crt à la racine du dossier / sdcard dans votre appareil Android À l'intérieur de votre appareil Android, Paramètres> Sécurité> Installer à partir du stockage.
Il doit détecter le certificat et vous permettre de l'ajouter à l'appareil Accédez à votre site de développement.
La première fois, il devrait vous demander de confirmer l'exception de sécurité. C'est tout.
Le certificat doit fonctionner avec n'importe quel navigateur installé sur votre Android (Navigateur, Chrome, Opera, Dolphin ...)
N'oubliez pas que si vous diffusez vos fichiers statiques à partir d'un domaine différent (nous sommes tous des putes à vitesse de page), vous devez également ajouter le certificat pour ce domaine.
la source
J'ai écrit une petite bibliothèque ssl-utils-android pour faire confiance à un certificat particulier sur Android.
Vous pouvez simplement charger n'importe quel certificat en donnant le nom de fichier à partir du répertoire des ressources.
Usage:
la source
Aucun de ces correctifs n'a fonctionné pour ma plate-forme de développement ciblant le SDK 16, version 4.1.2, j'ai donc trouvé une solution de contournement.
Mon application stocke les données sur le serveur en utilisant " http://www.example.com/page.php?data=somedata "
Récemment, page.php a été déplacé vers " https://www.secure-example.com/page.php " et je continue à recevoir "javax.net.ssl.SSLException: certificat de serveur non approuvé".
Au lieu d'accepter tous les certificats pour une seule page, en commençant par ce guide, j'ai résolu mon problème en écrivant ma propre page.php publiée sur " http://www.example.com/page.php "
la source
19 janvier 2020 PROBLÈME D'ÉMISSION DU Certificat auto-signé:
Pour lire une vidéo, une image, appeler le service Web pour tout certificat auto-signé ou vous connecter à une URL non sécurisée, appelez simplement cette méthode avant d'effectuer toute action, cela résoudra votre problème concernant le problème du certificat:
CODE KOTLIN
la source
Peut-être que cela sera utile ... cela fonctionne sur les clients java utilisant des certificats auto-signés (il n'y a pas de vérification du certificat). Soyez prudent et utilisez-le uniquement pour les cas de développement car ce n'est pas du tout sécurisé !!
Comment ignorer les erreurs de certificat SSL dans Apache HttpClient 4.0
J'espère que cela fonctionnera sur Android en ajoutant simplement la bibliothèque HttpClient ... bonne chance !!
la source
Il s'agit d'un problème résultant d'un manque de prise en charge de SNI (Server Name Identification) dansA, ndroid 2.x. Je luttais avec ce problème pendant une semaine jusqu'à ce que je tombe sur la question suivante, qui non seulement donne un bon aperçu du problème, mais fournit également une solution fonctionnelle et efficace dépourvue de toute faille de sécurité.
Erreur `` Pas de certificat de pair '' dans Android 2.3 mais PAS dans 4
la source