1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Zertifikate laden/ignorieren

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von nijoX, 28.09.2011.

  1. nijoX, 28.09.2011 #1
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    Moin Community,

    Ich bin atm an einer App dran bei der mit verschiedenen (vom nutzer eingegebenen) Webseiten kommuniziere. Das klappt soweit auch ganz gut, bis auf den Fall wenn man ein Sicherheitszertifikat benötigt. Habe nun schon einige Beispiele die ich gefunden habe versucht zu Implementieren, Problem dabei ... irgendwie wird es komplett ignoriert wie mir scheint.

    Der Code, zum "ignorieren" der Zertifikate, sieht momentan so aus

    Code:
        public final static class WebClientDevWrapper {
    
            public static HttpClient wrapClient(HttpClient base) {
                try {
                    SSLContext ctx = SSLContext.getInstance("SSL");
                    X509TrustManager tm = new X509TrustManager() {
    
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }
    
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain,
                                                       String authType)
                        throws CertificateException {
    
                        }
    
                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain,
                                                       String authType)
                        throws CertificateException {
    
                        }
                    };
                    ctx.init(null, new TrustManager[]{tm}, null);
                   SSLSocketFactory ssf = new SSLSocketFactory(null);
                    ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                    ClientConnectionManager ccm = base.getConnectionManager();
                    SchemeRegistry sr = ccm.getSchemeRegistry();
                    sr.register(new Scheme("https", ssf, 443));
                    return new DefaultHttpClient(ccm, base.getParams());
                } catch (Exception ex) {
                    ex.printStackTrace();
                    return null;
                }
            }
        }
    
    Den Client im Code erstelle ich so:
    Code:
    HttpClient client = new DefaultHttpClient(); //unwichtiges weggelassen ;)
                client = WebClientDevWrapper.wrapClient(client);
                String postURL = "http://bli.bla.blubb";
                HttpPost post = new HttpPost(postURL);
                post.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(username, password), "UTF-8", false));
               client.execute(post);
    
    Wenn ich nun versuche auf die seite zu gelangen bekomme ich im LogCat folgendes

    Code:
    09-02 10:20:10.470: WARN/System.err(5073): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:258)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    09-02 10:20:10.470: WARN/System.err(5073):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    09-02 10:20:10.480: WARN/System.err(5073):     at my.package.name.AndroidPxAppActivity.login(AndroidPxAppActivity.java:89)
    09-02 10:20:10.480: WARN/System.err(5073):     at my.package.name.AndroidPxAppActivity$2.onClick(AndroidPxAppActivity.java:174)
    09-02 10:20:10.480: WARN/System.err(5073):     at android.view.View.performClick(View.java:2485)
    09-02 10:20:10.480: WARN/System.err(5073):     at android.view.View$PerformClick.run(View.java:9080)
    09-02 10:20:10.480: WARN/System.err(5073):     at android.os.Handler.handleCallback(Handler.java:587)
    09-02 10:20:10.480: WARN/System.err(5073):     at android.os.Handler.dispatchMessage(Handler.java:92)
    09-02 10:20:10.480: WARN/System.err(5073):     at android.os.Looper.loop(Looper.java:123)
    09-02 10:20:10.480: WARN/System.err(5073):     at android.app.ActivityThread.main(ActivityThread.java:3695)
    09-02 10:20:10.480: WARN/System.err(5073):     at java.lang.reflect.Method.invokeNative(Native Method)
    09-02 10:20:10.480: WARN/System.err(5073):     at java.lang.reflect.Method.invoke(Method.java:507)
    09-02 10:20:10.480: WARN/System.err(5073):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
    09-02 10:20:10.480: WARN/System.err(5073):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    09-02 10:20:10.480: WARN/System.err(5073):     at dalvik.system.NativeStart.main(Native Method)
    
    Ich hoffe es gelingt jemandem meinen wahrscheinlich trivialen Fehler zu entdecken und mir weiter zu helfen :)


    EDIT: Hab soeben rausgefunden, dass wenn ich versuche mich mit einer Webseite ohne Zertifikat zu verbinden, der gleiche Fehler auftritt.
    MfG nijoX
     
    Zuletzt bearbeitet: 30.09.2011
  2. nijoX, 29.09.2011 #2
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    Moinsen,

    das No peer problem hab ich jetzt zumindest in den griff bekommen durch das abändern der WebCLientDevWrapper Klasse


    Code:
    public static HttpClient wrapClient(HttpClient base) {
                try {
                    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
                    trustStore.load(null, null);
                    SSLSocketFactory ssf = new SSLSocketFactory(trustStore); 
                    ssf.setHostnameVerifier(new X509HostnameVerifier() {
                        @Override
                        public void verify(String host, String[] cns, String[] subjectAlts)
                                throws SSLException {
                            
                        }
                        
                        @Override
                        public void verify(String host, X509Certificate cert) throws SSLException {
                            
                        }
                        
                        @Override
                        public void verify(String host, SSLSocket ssl) throws IOException {
                            
                        }
                        
                        @Override
                        public boolean verify(String host, SSLSession session) {
                            return true;
                        }
                    });
                  SchemeRegistry registry = new SchemeRegistry();
                  registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
                  registry.register(new Scheme("https", ssf, 443));
                    ClientConnectionManager ccm = new ThreadSafeClientConnManager(new BasicHttpParams(), registry);
    
                    return new DefaultHttpClient(ccm, base.getParams());
                } catch (Exception ex) {
                    ex.printStackTrace();
                    return null;
                }
            }
    

    Problem: da fleig nun erneut eine Exception zu der ich bei miener rechnerche nicht´s aber auch gar nichts gefunden hab


    Exception:

    Code:
    09-03 14:01:48.520: WARN/System.err(1403): javax.net.ssl.SSLHandshakeException: java.security.InvalidAlgorithmParameterException: trustAnchors.isEmpty()
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:477)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:750)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:692)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:171)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
    09-03 14:01:48.530: WARN/System.err(1403):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    09-03 14:01:48.540: WARN/System.err(1403):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    09-03 14:01:48.540: WARN/System.err(1403):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    09-03 14:01:48.540: WARN/System.err(1403):     at my.package.name.CertificateTestActivity$4.run(CertificateTestActivity.java:268)
    09-03 14:01:48.540: WARN/System.err(1403):     at java.util.Timer$TimerImpl.run(Timer.java:284)
    09-03 14:01:48.540: WARN/System.err(1403): Caused by: java.security.cert.CertificateException: java.security.InvalidAlgorithmParameterException: trustAnchors.isEmpty()
    09-03 14:01:48.540: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:144)
    09-03 14:01:48.540: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:664)
    09-03 14:01:48.540: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
    09-03 14:01:48.540: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:474)
    09-03 14:01:48.540: WARN/System.err(1403):     ... 16 more
    09-03 14:01:48.540: WARN/System.err(1403): Caused by: java.security.InvalidAlgorithmParameterException: trustAnchors.isEmpty()
    09-03 14:01:48.550: WARN/System.err(1403):     at java.security.cert.PKIXParameters.checkTrustAnchors(PKIXParameters.java:607)
    09-03 14:01:48.550: WARN/System.err(1403):     at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:84)
    09-03 14:01:48.550: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.<init>(TrustManagerImpl.java:75)
    09-03 14:01:48.550: WARN/System.err(1403):     at org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:132)
    09-03 14:01:48.550: WARN/System.err(1403):     at javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:225)
    09-03 14:01:48.550: WARN/System.err(1403):     at org.apache.http.conn.ssl.SSLSocketFactory.createTrustManagers(SSLSocketFactory.java:263)
    09-03 14:01:48.550: WARN/System.err(1403):     at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:190)
    09-03 14:01:48.550: WARN/System.err(1403):     at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:216)
    09-03 14:01:48.550: WARN/System.err(1403):     at my.package.name.CertificateTestActivity.wrapClient(CertificateTestActivity.java:201)
    09-03 14:01:48.550: WARN/System.err(1403):     at my.package.name.CertificateTestActivity$4.run(CertificateTestActivity.java:260)
    09-03 14:01:48.550: WARN/System.err(1403):     ... 1 more
    Ich hoffe das einer von euch das Problem schon kennt oder schonmal was Darüber gelesen hat und mir bei der Lösung meines Problems behilflich sein mag. ;)


    MfG nijoX
     
  3. nijoX, 07.10.2011 #3
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    schön das keiner mein Problem kennt :D

    hab´s aber inzwischen gelöst bekommen durch diesen wunderbaren link

    Android and self-signed ssl certificates | Synyx Weblog :)

    für alle die mal auf das selbe Problem stoßen sollten. Der Code funktioniert gut so wie er ist aber wenn man mehrere HttpPost´s in kurzer Zeit senden will sollte es noch optimiert werden, sonst dauert eine kleine Anfrage schonmal bis zu einer Sekunde.

    Hoffe das hilft einigen Leuten weiter :)

    MfG nijoX
     

Diese Seite empfehlen