Autore Topic: Problema con creazione connessione HTTPS  (Letto 2315 volte)

Offline ilcapitano4

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC WildFire
  • Sistema operativo:
    Ubuntu 11.10
Problema con creazione connessione HTTPS
« il: 22 Dicembre 2011, 12:37:36 CET »
0
Ciao a tutti,
sono un po di giorni che cerco di risolvere questo problema. In pratica devo interrogare un server che usa connessione HTTPS
ma creando il relativo HttpClient, mi viene ritornato il seguente errore dal LogCat:

Codice: [Seleziona]
12-22 11:37:27.333: E/AndroidRuntime(575): FATAL EXCEPTION: main
12-22 11:37:27.333: E/AndroidRuntime(575): java.lang.NoSuchMethodError: org.apache.http.conn.ssl.SSLSocketFactory.<init>
12-22 11:37:27.333: E/AndroidRuntime(575):         at app.simplypay.MobileRemoteHandlerActivity.createHttpClient(MobileRemoteHandlerActivity.java:182)
12-22 11:37:27.333: E/AndroidRuntime(575):         at app.simplypay.MobileRemoteHandlerActivity.<init>(MobileRemoteHandlerActivity.java:47)
12-22 11:37:27.333: E/AndroidRuntime(575):         at java.lang.Class.newInstanceImpl(Native Method)
12-22 11:37:27.333: E/AndroidRuntime(575):         at java.lang.Class.newInstance(Class.java:1319)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.app.ActivityThread.access$600(ActivityThread.java:122)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.os.Handler.dispatchMessage(Handler.java:99)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.os.Looper.loop(Looper.java:137)
12-22 11:37:27.333: E/AndroidRuntime(575):         at android.app.ActivityThread.main(ActivityThread.java:4340)
12-22 11:37:27.333: E/AndroidRuntime(575):         at java.lang.reflect.Method.invokeNative(Native Method)
12-22 11:37:27.333: E/AndroidRuntime(575):         at java.lang.reflect.Method.invoke(Method.java:511)
12-22 11:37:27.333: E/AndroidRuntime(575):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-22 11:37:27.333: E/AndroidRuntime(575):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-22 11:37:27.333: E/AndroidRuntime(575):         at dalvik.system.NativeStart.main(Native Method)

Ho provato a fare la stessa cosa in Java, e funziona tutto utilizzando il seguente codice per crearmi l'HttpClient, ma in android non và:
Codice (Java): [Seleziona]
public HttpClient createHttpClient(){
               
                try {
                       
                        HttpParams httpParams = new BasicHttpParams();
                        HttpProtocolParams.setVersion( httpParams, HttpVersion.HTTP_1_1 );
                               
                        HttpProtocolParams.setContentCharset( httpParams, HTTP.DEFAULT_CONTENT_CHARSET );
                       
                        SSLContext context = SSLContext.getInstance("TLS");
                        X509TrustManager trustManager  = new X509TrustManager() {
                         
                                public void checkClientTrusted(X509Certificate[] xcs, String string)
                                                throws CertificateException {}
                         
                                public void checkServerTrusted(X509Certificate[] xcs, String string)
                                                throws CertificateException {}
                         
                                public X509Certificate[] getAcceptedIssuers() {
                                        return null;
                                }
                        };
                       
                        context.init( null, new TrustManager[]{ trustManager }, null);
                        SSLSocketFactory socketFactory = new SSLSocketFactory( context );
                        socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                       
                        HttpClient tmpClient = new DefaultHttpClient();
                        ClientConnectionManager connManager = tmpClient.getConnectionManager();
                       
                        // Gestisco il protocollo HTTPS sulla porta 443.
                        SchemeRegistry schemeRegistry = connManager.getSchemeRegistry();
                        schemeRegistry.register(new Scheme("https", socketFactory, 443));
               
                        // Richieste HTTPS, che siano ThreadSafe.
                        connManager = new ThreadSafeClientConnManager( httpParams, schemeRegistry );
                       
                        tmpClient = new DefaultHttpClient( connManager, httpParams );
                       
                        return tmpClient;                              
                       
                } catch (Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }

Possibile che non ci sia un a classe che gestisca in maniera trasparente i certificati per l'hand-shake dell'SSL e, consenta di creare facilmente
una connessione HTTPS?

Grazie dell'attenzione! :-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema con creazione connessione HTTPS
« Risposta #1 il: 22 Dicembre 2011, 12:41:28 CET »
+1
Se il codice funziona in un'app java non necessariamente deve funzionare su Android.
Fortunatamente per te l'argomento è ritrito quindi trovi molte discussioni a riguardo.

ssl - Accepting a certificate for HTTPs on Android - Stack Overflow

java - Trusting all certificates using HttpClient over HTTPS - Stack Overflow

Offline ilcapitano4

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC WildFire
  • Sistema operativo:
    Ubuntu 11.10
Re:Problema con creazione connessione HTTPS
« Risposta #2 il: 22 Dicembre 2011, 20:22:43 CET »
0
Pensavo di aver risolto e invece...

Codice: [Seleziona]
12-22 19:08:58.859: W/System.err(597): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
12-22 19:08:59.033: W/System.err(597):         at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:137)
12-22 19:08:59.300: W/System.err(597):         at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
12-22 19:08:59.449: W/System.err(597):         at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
12-22 19:08:59.569: W/System.err(597):         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
12-22 19:08:59.622: W/System.err(597):         at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-22 19:08:59.799: W/System.err(597):         at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-22 19:08:59.799: W/System.err(597):         at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
12-22 19:08:59.799: W/System.err(597):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-22 19:08:59.889: W/System.err(597):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-22 19:08:59.889: W/System.err(597):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
12-22 19:08:59.889: W/System.err(597):         at app.simplypay.MobileRemoteHandlerActivity$ConnectionSonicTask.doInBackground(MobileRemoteHandlerActivity.java:108)
12-22 19:08:59.889: W/System.err(597):         at app.simplypay.MobileRemoteHandlerActivity$ConnectionSonicTask.doInBackground(MobileRemoteHandlerActivity.java:1)
12-22 19:08:59.949: W/System.err(597):         at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-22 19:08:59.979: W/System.err(597):         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-22 19:09:00.129: W/System.err(597):         at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-22 19:09:00.470: W/System.err(597):         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-22 19:09:00.634: W/System.err(597):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-22 19:09:00.669: W/System.err(597):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-22 19:09:00.989: W/System.err(597):         at java.lang.Thread.run(Thread.java:856)

anche se l'argomento è ritrito, è comunque ostico(almeno secondo me), naturalmente essendo neofita ho scritto prima in java, ma mi aspettavo potesse non
funzionare in android.

Grazie comunque dell'aiuto.