Java Jsoup - fehlerhaftes SSL Zertifikat ignorieren

MaxDev

Lt. Commander
Registriert
Okt. 2009
Beiträge
2.033
Guten Abend liebe Leute,

ich programmiere gerade eine Android-App für meine Schule, die den Vertretungsplan darstellen soll.
Importiert werden die Daten aus HTML Tabellen, die auf dem Schulserver liegen. Das klappt auch alles, sofern ich die HTML Datei vorher auf meinen eigenen Server geladen habe.

Grund dafür ist, dass unser Schulserver ein HTTPS Zertifikat nutzt, was damals auf Grund von Kostengründen selber signiert wurde. Die Browser mögen das natürlich nicht und vermelden Warnungen (aus gutem Grund), die per Klick ignoniert werden können.
Ich bekomme es allerdings nicht hin, jsoup zu überreden, das fehlerhafte Zertifikat zu ignorieren.

Link zur Seite der Klasse 5a (Beispiel): https://service.copernicus-gymnasium.de/vertretungsplan/schueler/w/13/w00001.htm
(Fehlerhaftes Zertifikat, dass ignoriert werden soll)

Ich habe mir das Zertifikat heruntergeladen und zu einer .jks Datei konvertiert (Wie hier beschrieben).
Diese Datei liegt nun im res Ordner der App:
root.PNG

In meiner Mainactivity sieht das ganze so aus:
Code:
// URL Address
	String url = "https://service.copernicus-gymnasium.de/vertretungsplan/schueler/w/13/w00001.htm";

protected Void doInBackground(Void... params) {
			// Create an array
			arraylist = new ArrayList<HashMap<String, String>>();
 
			try {
				// Connect to the Website URL
				System.setProperty("javax.net.ssl.trustStore", "/res/copgym.jks");
				Document doc = Jsoup.connect(url).get();
				// Identify Table Class "Vertretung"
				for (Element table : doc.select("table")) {
.................

Damit möchte ich bezwecken, dass das Zertifikat als vertrauenswürdig angesehen wird, was allerdings nicht klappt :(

LogCat dazu:
Code:
03-29 23:19:01.220: I/LoadedApk(30206): No resource references to update in package common
03-29 23:19:01.230: I/LoadedApk(30206): No resource references to update in package com.zyxxeil.elixium.ui
03-29 23:19:01.230: I/LoadedApk(30206): No resource references to update in package com.zyxxeil.elixium.ui
03-29 23:19:01.330: D/OpenGLRenderer(30206): Render dirty regions requested: true
03-29 23:19:01.340: D/Atlas(30206): Validating map...
03-29 23:19:01.410: I/Adreno-EGL(30206): <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1_RB1.04.04.02.002.022_msm8974_LA.BF.1.1_RB1__release_AU ()
03-29 23:19:01.410: I/Adreno-EGL(30206): OpenGL ES Shader Compiler Version: E031.25.01.03
03-29 23:19:01.410: I/Adreno-EGL(30206): Build Date: 10/30/14 Thu
03-29 23:19:01.410: I/Adreno-EGL(30206): Local Branch: mybranch5388235
03-29 23:19:01.410: I/Adreno-EGL(30206): Remote Branch: quic/LA.BF.1.1_rb1.8
03-29 23:19:01.410: I/Adreno-EGL(30206): Local Patches: NONE
03-29 23:19:01.410: I/Adreno-EGL(30206): Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1_RB1.04.04.02.002.022 +  NOTHING
03-29 23:19:01.410: I/OpenGLRenderer(30206): Initialized EGL, version 1.4
03-29 23:19:01.440: D/OpenGLRenderer(30206): Enabling debug mode 0
03-29 23:19:01.570: W/System.err(30206): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
03-29 23:19:01.570: I/Timeline(30206): Timeline: Activity_idle id: android.os.BinderProxy@20774b47 time:46545617
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:306)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.Connection.upgradeToTls(Connection.java:197)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.Connection.connect(Connection.java:151)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:25)
03-29 23:19:01.580: W/System.err(30206): 	at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:449)
03-29 23:19:01.580: W/System.err(30206): 	at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:434)
03-29 23:19:01.580: W/System.err(30206): 	at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:181)
03-29 23:19:01.580: W/System.err(30206): 	at org.jsoup.helper.HttpConnection.get(HttpConnection.java:170)
03-29 23:19:01.580: W/System.err(30206): 	at com.maxl.copgymvertretungsplan.MainActivity$JsoupListView.doInBackground(MainActivity.java:82)
03-29 23:19:01.580: W/System.err(30206): 	at com.maxl.copgymvertretungsplan.MainActivity$JsoupListView.doInBackground(MainActivity.java:1)
03-29 23:19:01.580: W/System.err(30206): 	at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-29 23:19:01.580: W/System.err(30206): 	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-29 23:19:01.580: W/System.err(30206): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-29 23:19:01.580: W/System.err(30206): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-29 23:19:01.580: W/System.err(30206): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-29 23:19:01.580: W/System.err(30206): 	at java.lang.Thread.run(Thread.java:818)
03-29 23:19:01.580: W/System.err(30206): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:318)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:219)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:113)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:525)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
03-29 23:19:01.580: W/System.err(30206): 	at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:302)
03-29 23:19:01.580: W/System.err(30206): 	... 20 more
03-29 23:19:01.580: W/System.err(30206): Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
03-29 23:19:01.580: W/System.err(30206): 	... 26 more

Ich komme nicht wirklich weiter. Könnt ihr mir vielleicht einen Tipp geben, wie ich das ganze hinbekomme?
Wenn Ihr noch weitere Daten braucht, bitte melden!


Danke!
Max
 
Zuletzt bearbeitet:
du könntest es höchsten irgendwie lokal auf dem smartphone installieren. Bringt aber auch nix, wenn es auf nem anderen smartphone laufen soll.
Ergo-> Https mit ungültigem Zitat -> einfach falsch und sinnlos. hat keinen sinn was die schule da macht. Es geht ja bei zertifiakten darum, dass es keiner durch ein ungültiges austauschen kann, so is https eigentlich nutzlos.
was du machen kannsd: red mit dem Admin der Seite ob er die Vertretungspläne nicht ohne verschlüsselung bereitstellen kann
 
Erstmal vielen Dank für deinen Kommentar.

Ich Stimme dir voll und ganz zu. Ein ungültiges HTTPS Zertifikat zu nutzen ist mehr als sinnfrei und überhaupt nicht zweckmäßig.
Ich kenne zwar den Admin gut, allerdings ist die Wahrscheinlichkeit, alles über HTTP laufen zu lassen, sehr gering. Das wird nicht durchgehen, wieso auch immer - ich weiß nicht mal, ob der aktuelle Admin überhaupt weiß, wie man das umstellt, da das Zertifikat damals ein ehemaliger Admin installiert hat.

Es muss doch eine Möglichkeit geben, dies wirklich ignorieren zu können, ohne auf HTTP runter zu stufen. In Internet gibt es ja auch einige andere Posts dazu, die mir aber bis jetzt noch nicht weiter geholfen haben (weil ich wahrscheinlich zu blöd dafür bin :D )
 
Ich kenne mich mit JSoup zwar nicht aus, aber wieso probierst du es nicht damit:
https://github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/Connection.java#L142

Sieht doch genau nach dem aus, was du brauchst? :)

Also bei
Code:
Document doc = Jsoup.connect(url).get();
ein
Code:
validateTLSCertificates(false)
ergänzen, sodass die Zeile wie folgt aussieht:

Code:
Document doc = Jsoup.connect(url).validateTLSCertificates(false).get();

EDIT:
Ansonsten gäbe es noch das hier: http://nanashi07.blogspot.de/2014/06/enable-ssl-connection-for-jsoup.html
 
Ach verdammt, da ist ja ein Spoiler...
Post kann gelöscht werden bitte.
 
Zuletzt bearbeitet: (Eigene Dummheit >.<)
Genau aus diesem Grunde habe ich einen Spoiler gesetzt ;)
 
Zurück
Oben