Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

Zertifikate laden/ignorieren

Das Thema "Zertifikate laden/ignorieren" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 28.09.2011, 10:36   #1 (permalink)
Junior Mitglied

Registriert seit: 06.09.2011
Beiträge: 38
Abgegebene Danke: 2
Erhielt 5 Danke für 5 Beiträge
Standard Zertifikate laden/ignorieren

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

Geändert von nijoX (30.09.2011 um 09:39 Uhr)
nijoX ist offline   Mit Zitat antworten
Alt 29.09.2011, 14:18   #2 (permalink)
Junior Mitglied

Registriert seit: 06.09.2011
Beiträge: 38
Abgegebene Danke: 2
Erhielt 5 Danke für 5 Beiträge
Standard AW: Zertifikate laden/ignorieren

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
nijoX ist offline   Mit Zitat antworten
Alt 07.10.2011, 07:34   #3 (permalink)
Junior Mitglied

Registriert seit: 06.09.2011
Beiträge: 38
Abgegebene Danke: 2
Erhielt 5 Danke für 5 Beiträge
Standard AW: Zertifikate laden/ignorieren

schön das keiner mein Problem kennt

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
nijoX ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Zertifikate installieren fizwidget Android Allgemein 7 02.06.2011 18:43
Threads ignorieren matthes77 Anregungen 2 30.12.2010 11:50
Zertifikate verwalten TheSpiritof69 Root / Hacking / Modding für Motorola Milestone 0 20.08.2010 11:47
Headset-Taste ignorieren?? Fahni Android Allgemein 1 29.03.2010 19:22




Du liest gerade: "Zertifikate laden/ignorieren" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.