tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
558
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Hallo Leute!

    Ich entwickle ein Programm das automatisiert Rechnungen von einem Server runterläd, sich dazu gegebenfalls einloggt. Dazu nutze ich den Apache HttpClient.

    Manche Seiten benutzen selbst erstellte Zertifikate, wo durch es dann zu Problemen kam. Deswegen hab ich mir meinen eigenen TrustManager erstellt und ihn dem HTTPS Schema zugewiesen. Alles klappt wunderbar!

    TrustManager der allen zertifikaten vertraut:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    package com.bis.ssl;
     
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.X509TrustManager;
     
    public class TrustAllX509TrustManager implements X509TrustManager {
     
        @Override
        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }
     
        @Override
        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }
     
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }

    SSLSocketFactory:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
                SSLSocketFactory sslSocketFactory = null;
                SSLContext sslContext = SSLContext.getInstance("SSL");
                TrustManager easyTrustManager = new TrustAllX509TrustManager();
                sslContext.init(null, new TrustManager[]{easyTrustManager}, new SecureRandom());
                sslSocketFactory = new SSLSocketFactory(sslContext);
     
                Scheme https = new Scheme("https", 443, sslSocketFactory);
                Scheme http = new Scheme("http", 80, PlainSocketFactory.getSocketFactory());
                SchemeRegistry schemeRegistry = new SchemeRegistry();
                schemeRegistry.register(http);
                schemeRegistry.register(https);
     
                HttpParams params = new BasicHttpParams();
     
                ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);
                this.httpClient = new DefaultHttpClient(cm, params);

    Für den Fall das man nur zertifizierte Zertifikate (die von Java aus dabei sind) annehmen darf benötige ich jetzt eine SSLSocketFactory die ich dem HTTPS Scheme zuweisen kann! Also eigentlich einfach den Java Standard für so etwas. Doch ich find einfach nichts nützliches im Internet.

    Ich benutze Apache HttpClient 4.1!
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    hast du vielleicht eine Beispielseite parat mit dem man solch eine SSLSocketFactory testen kann.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Ich benutze die folgende Seite: https://www.swisscom-mobile.ch/ebill...itiate&lang=de

    Sollte ich die diese spezifische SocketFactory weglasen bekomme ich folgene Exception:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
            at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
            at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
            at org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:446)
            at org.apache.http.impl.conn.DefaultClientConnectionOperator.updateSecureConnection(DefaultClientConnectionOperator.java:200)
            at org.apache.http.impl.conn.AbstractPoolEntry.layerProtocol(AbstractPoolEntry.java:277)
            at org.apache.http.impl.conn.AbstractPooledConnAdapter.layerProtocol(AbstractPooledConnAdapter.java:142)
            at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:758)
            at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:565)
            at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:941)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:927)

    Mein Code (SSLSocketFactory auskommentiert):
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
                SSLSocketFactory sslSocketFactory = null;
                SSLContext sslContext = SSLContext.getInstance("SSL");
                TrustManager easyTrustManager = new TrustAllX509TrustManager();
                sslContext.init(null, new TrustManager[]{easyTrustManager}, new SecureRandom());
                sslSocketFactory = new SSLSocketFactory(sslContext);
     
    //            Scheme https = new Scheme("https", 443, sslSocketFactory);
    //            Scheme http = new Scheme("http", 80, PlainSocketFactory.getSocketFactory());
    //            SchemeRegistry schemeRegistry = new SchemeRegistry();
    //            schemeRegistry.register(http);
    //            schemeRegistry.register(https);
     
                HttpParams params = new BasicHttpParams();
     
                //ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);
                this.httpClient = new DefaultHttpClient(/*cm, */params);
    Geändert von zer0 (14.09.11 um 12:07 Uhr)
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  4. #4
    SE Tutorials.de Gastzugang
    Dein Link ist fehlerhaft ...
    Deiner enthält ein HTML-Sonderzeichen "&" ... was die Kodierung für das Zeichen "&" ist.
    Das das natürlich keine gültige URL ist erübrigt sich zu sagen.
    Die richtige URL müsste so lauten :
    https://www.swisscom-mobile.ch/ebill...itiate&lang=de
     

  5. #5
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Das werd ich schnell abändern! Wobei der Link bei mir trotzdem funktioniert!
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  6. #6
    slowfly slowfly ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Beiträge
    40
    Workaround:
    Wir haben bei uns selbst-zertifizierte QuoVadis Zertifikate, das wird in unseren aktuellen JDK's auch nicht "erkannt". Darum "müssen" wir in die Root-CA's von QuoVadis in einen Truststore speichern.

    Das geht so, indem du auf die Seite gehst, das Zertifikat runterlädtst und mit dem keytool vom SDK das CRT in den Truststore lädtst, resp. den Truststore updatest. Beim Starter der VM kann man mit vm-Parametern den Truststore angeben.

    Vorteil: Es ist "sicherer" und du musst nichts Programmieren.
    Nachteil: Wenn sich das Root-CA mal ändert,... geht je nachdem gar nichts mehr...

    Gruss
    slowy
     

  7. #7
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,


    hier:
    http://www.exampledepot.com/egs/java...stAnchors.html
    wird gezeigt wie man alle Standardmäßig vertrauten Root CAs im JDK auflistet.
    Eventuell kannst du daraus die gewünschten X509-Zertifkate in deinem eigenen TrustManager verwenden.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  8. #8
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Erstmal danke für den Link.
    Aber da muss es doch schon eine Java Built-In Lösung geben, also ein TrustManager der allen Java Zertifikaten vertraut.

    Für die selbst zertifizierten Zertifikate habe ich mein TrustManager der alle Zertifikate erlaubt und jetzt brauch ich einen der nur den Java builtin Zertifikaten vertraut.
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 23.08.11, 21:06
  2. Antworten: 7
    Letzter Beitrag: 30.12.10, 15:05
  3. Login via apache httpclient
    Von Orex im Forum Java
    Antworten: 1
    Letzter Beitrag: 09.09.10, 08:06
  4. Apache HttpClient - Cookie-Problem
    Von Julian-w im Forum Java
    Antworten: 1
    Letzter Beitrag: 14.03.09, 14:00
  5. HttpClient von Apache
    Von ATha1 im Forum Java
    Antworten: 1
    Letzter Beitrag: 11.07.06, 11:15