2014-07-04 7 views
5

J'ai des problèmes pour charger des pages Web sécurisées SSL avec Androids WebView. J'ai toujours des erreurs comme: onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>Certificats WebView et SSL

J'ai déjà installé tous les certificats de la chaîne de certificat de ce serveur dans le trousseau d'Android via Paramètres-> Sécurité-> Installer à partir de la carte SD. Je peux même voir que l'un des certificats installés correspond parfaitement à la sortie d'erreur de LogCat. Cela devient encore plus étrange si j'utilise l'application Browser par défaut: elle charge la page sans aucun problème même si je désinstalle tous les certificats mentionnés précédemment. Je n'ai aucune idée de comment résoudre ce problème sans faire confiance à tous les certificats en appelant le handler.proceed() en onReceivedSslError(), ce qui représente un problème de sécurité potentiel. Toute aide est appréciée. Merci!

Vive Bjoern

EDIT: Le certificat racine est auto-signé parce qu'il est uniquement destiné à être utilisé pour les serveurs intranet. Je pensais que tous les certificats que j'ajoute aux informations d'identification de confiance Android seraient approuvés.

+0

Si vous voulez que nous vous aidions, vous devriez fournir de vraies informations plutôt que d'utiliser le site de quelqu'un d'autre comme 'xyz.com' (c'est un vrai site). – jww

+0

Désolé d'utiliser un hôte valide. Malheureusement, je ne peux pas divulguer des informations sur le client et j'espère que vous pouvez le comprendre. – bjoernb

Répondre

2

Bien onReceiveSslError() et handler.proceed() doivent être utilisés lors de la connexion à des services avec des certificats auto-signés, le webview ne s'entend pas avec eux.

La réflexion que je voudrais regarder maintenant est l'implémentation ssl côté serveur. Si vous avez plusieurs services avec le même certificat CERT pour le support SNI et s'il est bien configuré. Ensuite, regardez si le service que vous êtes en train de connecter renvoie le bon certificat. Vérifiez également le nom alternatif du sujet à partir de votre serveur et configurez-le selon vos besoins.

Pour cette tâche, vous pouvez utiliser ces commandes.

openssl s_client -showcerts -connect yourhost.com:443 

openssl s_client -connect yourhost.com:443 

openssl s_client -servername yourhost.com -connect yourhost.com:443 

openssl s_client -connect yourhost.com:443 | openssl x509 -text 

Ici vous avez un peu plus d'informations à partir de la documentation Android

Problèmes courants avec Hostname vérification Comme mentionné au début de cet article, il y a deux éléments clés pour vérifier une connexion SSL . Le premier consiste à vérifier que le certificat provient d'une source de confiance, qui était au centre de la section précédente. L'objectif de cette section est la deuxième partie: s'assurer que le serveur avec lequel vous parlez présente le bon certificat. Quand il ne est pas, vous voyez généralement une erreur comme ceci:

java.io.IOException: hostname « example.com » n'a pas été vérifiée à libcore.net.http.HttpConnection.verifySecureSocketHostname (HttpConnection. java: 223) à libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect (HttpsURLConnectionImpl.java:446) à libcore.net.http.HttpEngine.sendSocketRequest (HttpEngine.java:290) à libcore.net.http. HttpEngine.sendRequest (HttpEngine.java:240) à libcore.net.http.HttpURLConnectionImpl.getResponse (HttpURLConnectionImpl.java:282) à libcore.net.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:177) à libcore.net.http.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:271) Une raison pour laquelle cela peut se produire est due à une erreur de configuration du serveur.Le serveur est configuré avec un certificat qui n'a pas d'objet ou d'autres champs de nom de sujet qui correspondent au serveur que vous tentez d'atteindre, à savoir . Il est possible d'utiliser un seul certificat avec plusieurs serveurs différents. Par exemple, en regardant le certificat google.com avec openssl s_client -connect google.com:443 | openssl x509 - vous pouvez voir qu'un sujet qui supporte * .google.com mais soumet également d'autres noms pour * .youtube.com, * .android.com, et autres. L'erreur se produit uniquement lorsque le nom du serveur auquel vous vous connectez n'est pas répertorié par le certificat comme acceptable.

Malheureusement cela peut arriver pour une autre raison: hébergement virtuel . Lors du partage d'un serveur pour plusieurs noms d'hôte avec HTTP, , le serveur Web peut déterminer, à partir de la requête HTTP/1.1, quel nom d'hôte cible le client recherche . Malheureusement, cela est compliqué avec HTTPS, car le serveur doit savoir quel certificat retourner avant de voir la requête HTTP. Pour résoudre ce problème, les nouvelles versions de SSL, en particulier TLSv.1.0 et versions ultérieures, prennent en charge l'indication de nom de serveur (SNI) , qui permet au client SSL de spécifier le nom d'hôte au serveur afin que le certificat approprié puisse être renvoyé.

Heureusement, HttpsURLConnection supporte SNI depuis Android 2.3. Malheureusement, Apache HTTP Client ne fonctionne pas, ce qui est l'une des nombreuses raisons nous déconseillons son utilisation. Une solution de contournement si vous devez prendre en charge Android 2.2 (ou plus ancien) ou Apache HTTP Client est de configurer un hôte virtuel alternatif sur un port unique afin qu'il soit univigu quel certificat de serveur à retourner.

Espérons que ça aide.