Https Verbindung aufbauen


#1

Hallo zusammen,

ich hätte da wieder ein anliegen, bei dem ich auf eure Expertiese vertraue :smiley:

Undzwar habe ich eine Anwendung, die bisher über eine URL (java.net.URL) eine Verbindung zu einer Website aufbaut. Hat auch alles bisher wunderbar geklappt.
Jetzt hat die Seite aber auf Https umgestellt und seither funktioniert mein Programm nichtmehr.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

an der Stelle, wo zum ersten Mal eine Verbindung aufgebaut werden soll.
Ich hab natürlich schon selbst nach Lösungen gesucht und sowohl https://github.com/escline/InstallCert als auch versucht das Zertifikat selber mittels “keytool” zu “cacerts” hinzuzufügen, hat leider am Ergebnis nichts geändert.

Jetzt hoffe ich, dass mir jemand noch den entscheidenden Tipp geben kann :smiley:

MfG
Clayn


#2

Ist das Zertifikat auf der Gegenseite denn ordentlich eingerichtet? (Test hier: https://www.ssllabs.com) Gerade wenn ein Zertifikat eine Zwischenzertifikatsstelle erwartet und der Server diese nicht mit ausliefert, kann es oft zu Problemen kommen. Ich würde zuerst mal das eigentliche Problem isolieren.

Notfalls gibt es auch die Möglichkeit, serverseitige Zertifikatsfehler zu ignorieren, wenn es nur ein kleines Tool für dich selbst ist.


#3

Und wie ignoriere ich die?^^ Die Idee hinter dem Programm war eig, dass auch andere das benutzen aber davon bin ich inzwischen Weg, also wenn es bei mir funktioniert ist alles gut.
Ansonsten hab ich jetzt mal den Test gemacht (ssllabs) und der gibt ein Rating von A.

Wenn manche Sachen etwas “blöd” rüberkommen, liegt es daran, dass ich mir bisher über SSH/SSL und dem ganzen drumherum wenig Gedanken gemacht habe.
Ausprobieren kann ich auch erst heute Abend wieder.


#4

Ich glaube hiermit habe ich mal in unserer lokalen DEV Umgebung SSL Fehler ignoriert:

Whats an easy way to totally ignore ssl with java url connections? - Stack Overflow


#5

Werde ich mir anschauen/ausprobieren und über die Ergebnisse berichten.
Im Vorraus schonmal Danke


#6

	private static X509Certificate cert;

	public static void setup() throws KeyManagementException, NoSuchAlgorithmException, CertificateException {

		final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
		cert = (X509Certificate) certificateFactory.generateCertificate(CustomTrustManager.class.getClassLoader().getResourceAsStream("res/mycert.crt"));

		final TrustManager[] trustManager = new TrustManager[] {
				new X509TrustManager() {
					public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
					public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws CertificateException { }
					public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws CertificateException {
						boolean found = false;
						for(int i = 0; i < certs.length; i++) {
							found |= certs**.equals(cert);
						}
						if (!found) throw new CertificateException();
					}
				}
		};

		final SSLContext sslContext = SSLContext.getInstance("SSL");
		sslContext.init(null, trustManager, new java.security.SecureRandom());
		HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
	}

//	public static void main(String[] args) throws Exception {
//		CustomTrustManager.setup();
//
//		URL url = new URL("https://");
//		HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
//		con.connect();
//		BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
//		String line;
//		while ((line = br.readLine()) != null)
//			System.out.println(line);
//
//		con.disconnect();
//
//	}

}

funktioniert bei mir


#7

So das versprochene Feedback:

Ich hab die Lösung von mogel ausprobiert und es funktioniert tadelos. Ich bin begeistert.
Auch danke an inv_zim, ich werde deinen vorschlag auch ausprobieren/einbauen für den Fall der Fälle.

Mfg
Clayn