2012-02-20 4 views
0

Je suis au milieu du développement d'une application dans android, ce qui nécessite moi sslhandshake avec le serveur, en utilisant les bibliothèques KSOAP2.Connexion SSL en android

Je suis capable de réaliser la même chose sur les sites http, mais échoue sur les sites HTTPS, en disant "impossible de valider le certificat".

Quelqu'un peut-il aider

+0

montrez-nous du code et/ou une sortie de console. Merci –

Répondre

0

ce code peut être utile? https://github.com/mixare/mixare/blob/master/src/org/mixare/MixContext.java

 HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){ 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      }}); 
    SSLContext context = SSLContext.getInstance("TLS"); 
    context.init(null, new X509TrustManager[]{new X509TrustManager(){ 
     public void checkClientTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException {} 
     public void checkServerTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException {} 
     public X509Certificate[] getAcceptedIssuers() { 
      return new X509Certificate[0]; 
     }}}, new SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(
      context.getSocketFactory()); 

Ce code est utilisé dans mixare.org pour accepter les certificats auto-signés.

Veuillez noter que vous n'êtes pas à l'abri des attaques MITM lorsque vous utilisez cette approche.

HTH, Daniele

1

S'il vous plaît noter que au moins avant les versions Android 2.3 ne sont pas l'autorité de certification racine pour le RapidSSL CA entre autres.

Vous pouvez vérifier l'émetteur d'un certificat problématique avec des sites tels que http://www.digicert.com/help/

Une autre vérification rapide est d'essayer de charger une page HTTPs dans le navigateur stock et voir si elle se plaint du certificat.

Si cela ne correspond pas à votre situation, ignorez cette réponse.

Si vous avez un certificat signé par cette autorité de certification, vous devez soit

  1. poignée explicitement dans votre application en faisant quelque chose comme réponse Danieles, mais en fait également de comparer le certificat à un stocké un pour RapidSSL (ou tout autre tu utilises).
  2. Ajoutez un certificat intermédiaire à la chaîne sur le serveur Web concerné pour que le certificat RapidSSL soit certifié par GeoTrust.

Découvrez

http://code.google.com/p/android/issues/detail?id=10807 https://knowledge.rapidssl.com/support/ssl-certificate-support/index?page=content&id=AR1549

0

Vous pouvez utiliser SelfSignedCertificate. Utilisez simplement cette méthode en tant que HTTPClient:

public static HttpClient getNewHttpClient() { 
    try { 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null, null); 

     SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
     sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", sf, 443)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
     return new DefaultHttpClient(); 
    } 
}