34 votes

HTTPS GET (SSL) avec Android et certificat de serveur auto-signé

J'ai regardé dans les différents postes sur la façon de récupérer quelque chose via HTTPS sur Android, à partir d'un serveur qui utilise un certificat auto-signé. Cependant, aucun d'entre eux semblent - ils tous ne parviennent pas à éliminer la

javax.net.le protocole ssl.SSLException: Pas de confiance certificat du serveur de messages.

Ce n'est pas une option pour modifier le serveur pour avoir un certificat de confiance, et il n'est également pas une option pour rendre le certificat de serveur correspondre à l'adresse IP du serveur.

Notez que le serveur ne va pas avoir un nom de DNS, il n'aura qu'une adresse IP. La requête GET ressemble à quelque chose comme ceci:

 https://username:password@anyIPAddress/blabla/index.php?param=1&param2=3

Je suis pleinement conscient que cette solution est sujette à man-in-the-middle attaques etc.

Donc, la solution doit ignorer le manque de confiance dans le certificat, et d'ignorer la discordance de nom d'hôte.

Quelqu'un connais le code, qui fait cela, à l'aide de Java pour Android?

Il y a beaucoup de tentatives pour expliquer ce sur stackoverflow.comet beaucoup, beaucoup de fragments de code, mais ils ne semblent pas fonctionner, et personne n'en a fourni un bloc de code qui résout ce, aussi loin que je peux voir. Il serait intéressant de savoir si quelqu'un a résolu ce, ou si Android bloque simplement les certificats qui ne sont pas de confiance.

39voto

SimonJ Points 10072

Comme vous l'avez justement remarquer, il y a deux problèmes: a) le certificat n'est pas approuvé, et b) le nom sur le certificat ne correspond pas au nom d'hôte.

AVERTISSEMENT: pour quelqu'un d'autre pour arriver à cette réponse, c'est un sale, horrible hack et vous ne devez pas l'utiliser pour ce que les questions. SSL/TLS sans authentification est pire que pas de cryptage - la lecture et la modification de vos "crypté" données est trivial pour un attaquant et que vous ne savez même pas ce qui se passait.

Toujours avec moi? Je craignais donc...

a) est résolu par la création d'une coutume SSLContext dont TrustManager accepte quoi que ce soit:

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] {
  new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType) {}
    public void checkServerTrusted(X509Certificate[] chain, String authType) {}
    public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
  }
}, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

et b) par la création d'un HostnameVerifier qui permet la connexion à aller de l'avant même si le cert ne correspond pas au nom d'hôte:

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) {
    return true;
  }
});

Les deux doivent se produire dès le début de votre code, avant de commencer à déconner avec HttpsURLConnections et ainsi de suite. Cela fonctionne à la fois sous Android et régulières de la JRE. Profitez de.

38voto

Moss Points 3813

J'ai fait une application qui utilise l'auto-signé ou faire confiance à tous les certs. La source est ici: http://code.google.com/p/meneameandroid/source/browse/#svn/trunk/src/com/dcg/auth et libre de l'utiliser :P

Utilisez simplement le HttpManager et de créer le SSL usine à l'aide de la confiance à tous une: http://code.google.com/p/meneameandroid/source/browse/trunk/src/com/dcg/util/HttpManager.java

EDIT: mise à jour des Liens

7voto

Yuliy Points 8854

Si vous utilisez un HttpsURLConnection, essayez d'appeler setHostnameVerifier dessus avant connect() , et passez-lui un HostnameVerifier qui accepte juste indépendamment de la véracité.

6voto

Maciek Sawicki Points 1418

Vous pouvez le faire en toute tranquillité en toute sécurité: http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

2voto

Colin Hebert Points 40084

Si vous disposez d'un accès pour les périphériques que vous pouvez ajouter le certificat à un fichier de clés. Voir plus d'informations ici.

D'autre part, vous pouvez utiliser cette méthode, mais je pense que c'est un peu laid.


Ressources :

Sur le même sujet :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X