Android : java.io.IOException: nom d'hôte n'a pas été vérifiée
lors de l'exécution de mon application prise en java.io.IOException: nom d'hôte n'a pas été vérifiée, comment puis-je le résoudre ?
java.io.IOException: Hostname '178.61.62.140' was not verified
01-03 16:34:37.613: W/System.err(17118): at libcore.net.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:224)
01-03 16:34:37.615: W/System.err(17118): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:454)
01-03 16:34:37.615: W/System.err(17118): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-03 16:34:37.616: W/System.err(17118): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-03 16:34:37.617: W/System.err(17118): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
01-03 16:34:37.617: W/System.err(17118): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:194)
01-03 16:34:37.618: W/System.err(17118): at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)
01-03 16:34:37.618: W/System.err(17118): at com.axis.cbk.httpmodel.CustHttpClient.executeHttpPost(CustHttpClient.java:120)
01-03 16:34:37.619: W/System.err(17118): at com.axis.cbk.MainActivity$ProcessIt.doInBackground(MainActivity.java:237)
01-03 16:34:37.619: W/System.err(17118): at com.axis.cbk.MainActivity$ProcessIt.doInBackground(MainActivity.java:1)
01-03 16:34:37.621: W/System.err(17118): at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-03 16:34:37.626: W/System.err(17118): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-03 16:34:37.626: W/System.err(17118): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-03 16:34:37.627: W/System.err(17118): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-03 16:34:37.628: W/System.err(17118): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-03 16:34:37.630: W/System.err(17118): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-03 16:34:37.631: W/System.err(17118): at java.lang.Thread.run(Thread.java:856)
01-03 16:34:37.632: I/System.out(17118): [CDS]close[48194]
01-03 16:34:37.633: I/System.out(17118): close [socket][/0.0.0.0:48194]
- voir stackoverflow.com/questions/14619781/... et stackoverflow.com/questions/19157710/...
- user2805994, s'il vous plaît ne pas auto-saccager vos questions.
Vous devez vous connecter pour publier un commentaire.
Vous effectuez une connexion HTTPS avec une adresse IP. Maintenant, les certificats SSL sont liés à des noms de domaine qualifiés et puisque vous n'êtes pas à l'aide d'un nom d'hôte DNS pour se connecter, le certificat ne peut pas être vérifiée.
Utilisation réelle de nom DNS pour se connecter, ou dans certains cas rares, écrivez votre propre nom d'hôte du vérificateur qui accepte votre hôte (attention: il est très facile d'introduire des vulnérabilités là).
@laalto est fait quelques bons points dans sa réponse. Il y a aussi une autre solution qui ne nécessite aucune modification de votre code Android que j'ai décrites ci-dessous.
tl;dr - modifier le fichier /etc/hosts sur votre appareil Android et ajouter une nouvelle entrée de mappage de votre auto-signé cert nom commun de l'adresse IP de votre serveur de développement.
J'ai décrit le processus complet ci-dessous...
Créer votre certificat comme d'habitude avec quelque chose comme:
Dans la deuxième commande, définissez le nom commun quel que soit le nom de domaine que vous souhaitez, pour cet exemple je vais utiliser testssl.com .
Je suis en utilisant stunnel le proxy de ma connexion ssl donc le 3ème commande pourrait ne pas être applicable. De toute façon, lorsque votre site web est d'utiliser le cert vous venez de créer, ouvrir un navigateur sur votre ordinateur et accédez à votre site. Comme vous pouvez vous attendre, vous devriez obtenir un avertissement de sécurité si tout va comme prévu. Afficher le certificat et l'exporter en tant que X. 509 certificat de chaîne (PEM) . Disons que nous l'enregistrer en tant que testssl.com.
Maintenant, exécutez la commande suivante pour convertir le format PEM dans un format de certificat que vous pouvez télécharger sur votre appareil Android.
À l'aide de la bad, vous pouvez maintenant pousser votre cert sur votre appareil.
Sur votre appareil Android, accédez à Paramètres->Sécurité>Installer à partir d'un périphérique de stockage. Vous devez être présentée avec le nom que vous avez donné votre cert, pour moi c'est testssl.com.crt.
De modifier votre fichier /etc/hosts, vous aurez besoin de remonter votre système /de partition en lecture écriture et, malheureusement, vous aurez besoin de la ligue pour cette.
Nous allons mettre le système /de partition de retour à lire que plus tard.
Maintenant permet de saisir le fichier hosts, le modifier, et ensuite mettre sur le dos de l'appareil avec les commandes suivantes.
Vous pouvez maintenant ajouter une ligne à votre fichier hosts afin qu'il ressemble à quelque chose comme [development_server_ip_address] [nom_domaine]. Donc, en supposant que j'ai utilisé les paramètres détaillés ci-dessus et que mon serveur de dev a une IP 192.168.1.10, ensuite, j'ai ajouter la ligne suivante dans mon fichier hosts:
Vous pouvez maintenant utiliser votre fichier hosts modifié après exécutant les commandes suivantes.
Pour rendre le système /de partition en lecture seule exécutez la commande suivante à partir de la commande adb shell.
Maintenant votre application Android, ainsi que tous les autres qui utilisent un HTTPSUrlConnection objet à connecter pour le nom de domaine que vous avez ajouté dans votre fichier hosts, ne devrait pas recevoir un certificat d'erreurs. Et le meilleur de tous, vous n'avez pas à modifier une seule ligne de code.
Veuillez noter que le Certificat SSL de travail uniquement par Domaine de travail par adresse IP.
si vous utilisez IP ,insérer le code ci-dessous