Autore Topic: Connessione SSL + trustStore  (Letto 972 volte)

Offline Fenex86

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Google+
    • davide-vallicella/43/325/74
    • Mostra profilo
    • Libretto universitario
  • Dispositivo Android:
    Emulatore - 2.3
  • Sistema operativo:
    W7 - Kubuntu 11.10
Connessione SSL + trustStore
« il: 01 Novembre 2011, 11:05:29 CET »
0
Salve,
ho un problema per quanto riguarda la connessione al sito https://www.ssol.univr.it/main?ent=login.
Ho provato in tutte le maniere anche quelle suggerite in altri topic ma il risultato è sempre quello:

Codice: [Seleziona]
11-01 09:45:07.088: WARN/System.err(498): java.lang.Exception: Authentication Not trusted server certificate
11-01 09:45:07.108: WARN/System.err(498):     at tessst.aa.SslTestActivity.Authenticate(SslTestActivity.java:76)
11-01 09:45:07.108: WARN/System.err(498):     at tessst.aa.SslTestActivity.onCreate(SslTestActivity.java:44)
11-01 09:45:07.108: WARN/System.err(498):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-01 09:45:07.108: WARN/System.err(498):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-01 09:45:07.118: WARN/System.err(498):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-01 09:45:07.118: WARN/System.err(498):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-01 09:45:07.118: WARN/System.err(498):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-01 09:45:07.127: WARN/System.err(498):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 09:45:07.127: WARN/System.err(498):     at android.os.Looper.loop(Looper.java:123)
11-01 09:45:07.127: WARN/System.err(498):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-01 09:45:07.127: WARN/System.err(498):     at java.lang.reflect.Method.invokeNative(Native Method)
11-01 09:45:07.127: WARN/System.err(498):     at java.lang.reflect.Method.invoke(Method.java:521)
11-01 09:45:07.127: WARN/System.err(498):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-01 09:45:07.138: WARN/System.err(498):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-01 09:45:07.138: WARN/System.err(498):     at dalvik.system.NativeStart.main(Native Method)

Se volete vi posto il codice ma non credo sia di aiut.:

Codice (Java): [Seleziona]
public static void Authenticate() throws Exception {
                Log.i(TAG, "Authenticate()");
                HttpClient httpclient = getClient();
                HttpPost httppost = new HttpPost(
                                "https://www.ssol.univr.it/main?ent=login");
                try {
                        // Add your data
                        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                        nameValuePairs.add(new BasicNameValuePair("username", "id******"));
                        nameValuePairs.add(new BasicNameValuePair("password", "********"));
                        Log.i(TAG, "nameValuePairs added");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        Log.i(TAG, "entity added");
                        // Execute HTTP Post Request
                        HttpResponse response = httpclient.execute(httppost);
                        Log.i(TAG, "http executed");
                        Log.d(TAG, response.toString());
                } catch (ClientProtocolException e) {
                        Log.e(TAG, "Errore nel client protocol: " + e.getMessage());
                        throw new Exception("Authentication " + e.getMessage());
                } catch (UnknownHostException e) {
                        Log.e(TAG, "UnknownHostException: " + e.getMessage());
                        throw new Exception("Authentication " + e.getMessage());
                } catch (IOException e) {
                        Log.e(TAG, "IOException: " + e.getMessage());
                        throw new Exception("Authentication " + e.getMessage());
                }
        }

        public static DefaultHttpClient getClient() {
                Log.i(TAG, "getClient()");
                DefaultHttpClient ret = null;

                // sets up parameters
                HttpParams params = new BasicHttpParams();
                HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
                HttpProtocolParams.setContentCharset(params, "utf-8");
                params.setBooleanParameter("http.protocol.expect-continue", false);

                // registers schemes for both http and https
                SchemeRegistry registry = new SchemeRegistry();
                registry.register(new Scheme("http", PlainSocketFactory
                                .getSocketFactory(), 80));
                registry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
                ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(
                                params, registry);
                ret = new DefaultHttpClient(manager, params);
                return ret;
        }

Ho notato però che se faccio un'app. java, tramite le system property:
Codice (Java): [Seleziona]
System.setProperty("javax.net.ssl.trustStore", "trustStore");funziona e si connette; il trustStore me lo ricavo in questo modo:

Codice (Java): [Seleziona]
package tessst.aa;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

import android.os.Environment;

public class InstallCert {

        private String host;
        private int port;
        private File sd = Environment.getExternalStorageDirectory();
        private File f = new File(sd, "trust");

        public InstallCert(String url) {
                this.host = url;
                this.port = 443;
        }

        public KeyStore getUpdatedTrustStore() throws KeyStoreException,
                        NoSuchAlgorithmException, CertificateException, IOException,
                        KeyManagementException {
                KeyStore trustStore = KeyStore.getInstance("BKS");
                trustStore.load(null);

                SSLContext context = SSLContext.getInstance("TLS");
                TrustManagerFactory tmf = TrustManagerFactory
                                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
                tmf.init(trustStore);
                X509TrustManager defaultTrustManager = (X509TrustManager) tmf
                                .getTrustManagers()[0];
                SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
                context.init(null, new TrustManager[] { tm }, null);
                SSLSocketFactory factory = context.getSocketFactory();

                SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
                socket.setSoTimeout(10000);

                try {
                        socket.startHandshake();
                        socket.close();
                        System.out.println("\nCertificate is already trusted");
                } catch (SSLException e) {
                        X509Certificate[] chain = tm.chain;
                        if (chain == null) {
                                System.out.println("Could not obtain server certificate chain");
                                return null;
                        }

                        for (int k = 0; k < chain.length; k++) {
                                X509Certificate cert = chain[k];
                                String alias = host + "-" + (k + 1);
                                trustStore.setCertificateEntry(alias, cert);
                        }
                }
               
               
                OutputStream out = null;
                try {
                        out = new BufferedOutputStream(new FileOutputStream(f));
                        trustStore.store(out, "passwd".toCharArray());
                        System.out.println("Trust salvato!");
                }catch (Exception e) {
                        System.out.println("TrustStore non salvato: " + e.getMessage());
                } finally {
                        if (out != null) {
                                out.close();
                        }
                }
                 

                return trustStore;
        }

        private static class SavingTrustManager implements X509TrustManager {

                private final X509TrustManager tm;
                private X509Certificate[] chain;

                SavingTrustManager(X509TrustManager tm) {
                        this.tm = tm;
                }

                public X509Certificate[] getAcceptedIssuers() {
                        throw new UnsupportedOperationException();
                }

                public void checkClientTrusted(X509Certificate[] chain, String authType)
                                throws CertificateException {
                        throw new UnsupportedOperationException();
                }

                public void checkServerTrusted(X509Certificate[] chain, String authType)
                                throws CertificateException {
                        this.chain = chain;
                        tm.checkServerTrusted(chain, authType);
                }
        }
}

Spero mi sappiate aiutare. :-(

Offline Fenex86

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Google+
    • davide-vallicella/43/325/74
    • Mostra profilo
    • Libretto universitario
  • Dispositivo Android:
    Emulatore - 2.3
  • Sistema operativo:
    W7 - Kubuntu 11.10
Re:Connessione SSL + trustStore
« Risposta #1 il: 02 Novembre 2011, 14:53:13 CET »
0
non accavalcatevi una alla volta mi raccomando! :'(

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Connessione SSL + trustStore
« Risposta #2 il: 02 Novembre 2011, 15:25:18 CET »
0
Mi sembra che ne stai parlando già un un altro thread, o sbaglio?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Connessione SSL + trustStore
« Risposta #3 il: 02 Novembre 2011, 15:26:46 CET »
0
*** POST DOPPIO, CHIUSO ***

@Fenex86: evita up ed evita post doppi, grazie.