2011-07-14 4 views
4

J'essaye d'écrire un webservice pour android en utilisant JAVA et KSOAP2. SOAP est le seul protocole que je peux utiliser et ReST n'est pas une option. Donc, j'ai réussi à créer la requête SOAP et à me connecter au serveur en utilisant HTTP. Mais, j'ai besoin de HTTPS car les informations sensibles seront transférées. Désactiver la vérification du certificat n'est pas une option car les données sont sensibles et je DOIT utiliser SSL.Services web Android utilisant KSOAP2 et HTTPS

Depuis Android jeté erreur de certification en HTTPS, je crée mon propre keystore suivant

1- http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

et ajouté au projet. Mon code est similaire à
2- http://www.techques.com/question/1-4646121/Not-trusted-certificate-using-ksoap2-android.

J'ai aussi passé par

3-Https Connection Android

4-Apache HttpClient on Android producing CertPathValidatorException (IssuerName != SubjectName)

mais ne peut pas les utiliser directement.

Un pseudo code qui montre le code dans 1 par rapport au code dans 2 avec HTTPS sera grandement apprécié.

Que signifie réellement le dernier commentaire sur 2? Il utilise HttpsTransportSE dans son code mais dit qu'il a étendu HttpsServiceConnectionSE. Pouvez-vous montrer cela dans le pseudo code?

De même, devrais-je utiliser HttpsTransportSE ou HttpsServiceConnectionSE pour fournir l'URL à laquelle je vais me connecter.

Répondre

0

Fonctionne pour moi KSOAP + Web service WCF avec éclipse. Tomcat avec connexion et certificate/mot de passe

Peut-être cela peut vous aider

private static SoapObject getBody(final SoapSerializationEnvelope soapEnvelope) throws Exception { 
     if (soapEnvelope.bodyIn == null) { 
      throw new Exception("soapEnvelope.bodyIn=null"); 
     } 
     else if (soapEnvelope.bodyIn.getClass() == SoapFault.class) { 
      throw new ExceptionLogic((SoapFault) soapEnvelope.bodyIn)); 
     } 
     else { 
      return (SoapObject) soapEnvelope.bodyIn; 
     } 

    } 

private static SoapSerializationEnvelope sendRequete(final SoapObject soapReq, final String classMappingName, 
      final Class<?> classMapping, final int timeOutSpecial) { 



     final SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     soapEnvelope.implicitTypes = true; 
     soapEnvelope.dotNet = true; 

     if (classMappingName != null) { 
      soapEnvelope.addMapping(NAMESPACE, classMappingName, classMapping); 
     } 

     soapEnvelope.setOutputSoapObject(soapReq); 

     try { 

      final HttpTransportSE httpTransport = new HttpTransportSE(Constante.urlWebService, timeOutSpecial); 
      httpTransport.debug = BuildConfig.DEBUG; 

      // Prod 
      if (Constante.urlWebService.startsWith("https://")) { 
       final List<HeaderProperty> headerList = new ArrayList<HeaderProperty>(); 
       headerList.add(new HeaderProperty("Authorization", "Basic " 
         + org.kobjects.base64.Base64.encode((Constante.CERTIFICAT_LOGIN + ":" + Constante.CERTIFICAT_MDP).getBytes()))); 

       FakeX509TrustManager.allowAllSSL(); 
       httpTransport.call(NAMESPACE + "/" + soapReq.getName(), soapEnvelope, headerList); 
      } 
      // Test 
      else { 
       httpTransport.call(NAMESPACE + "/" + soapReq.getName(), soapEnvelope); 
      } 

      return soapEnvelope; 
     } 
     catch (final Exception e) { 
      throw new Exception("Erreur : " + e.getMessage(), e); 
     } 

    } 



    private static class FakeX509TrustManager implements X509TrustManager { 
     private static TrustManager[] trustManagers; 
     private final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {}; 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return _AcceptedIssuers; 
     } 

     public static void allowAllSSL() { 
      HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 

       @Override 
       public boolean verify(final String hostname, final SSLSession session) { 
        return true; 
       } 
      }); 
      SSLContext context = null; 
      if (trustManagers == null) { 
       trustManagers = new TrustManager[] { new FakeX509TrustManager() }; 
      } 
      try { 
       context = SSLContext.getInstance("TLS"); 
       context.init(null, trustManagers, new SecureRandom()); 
      } 
      catch (final NoSuchAlgorithmException e) { 
       e.printStackTrace(); 
      } 
      catch (final KeyManagementException e) { 
       e.printStackTrace(); 
      } 
      HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); 
     } 

     @Override 
     public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException { 

     } 

     @Override 
     public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { 

     } 
    } 
+0

je certificat client et appel SSL, cette approche est-travaille toujours? – Shweta