ERLEDIGT
NEIN
NEIN
ANTWORTEN
7
7
ZUGRIFFE
558
558
EMPFEHLEN
-
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
-
13.09.11 16:16 #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ß TomJava 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
-
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
-
13.09.11 18:06 #4SE 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
-
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
-
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
-
15.09.11 18:09 #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ß TomJava 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
-
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
-
Apache HttpClient über Proxy mit Authentifizierung auf externe Website zugreifen
Von tommey im Forum JavaAntworten: 9Letzter Beitrag: 23.08.11, 21:06 -
Authorization mit Apache HttpClient 4.x
Von xrax im Forum JavaAntworten: 7Letzter Beitrag: 30.12.10, 15:05 -
Login via apache httpclient
Von Orex im Forum JavaAntworten: 1Letzter Beitrag: 09.09.10, 08:06 -
Apache HttpClient - Cookie-Problem
Von Julian-w im Forum JavaAntworten: 1Letzter Beitrag: 14.03.09, 14:00 -
HttpClient von Apache
Von ATha1 im Forum JavaAntworten: 1Letzter Beitrag: 11.07.06, 11:15





Zitieren

Login





