StartSSL und HTTPS mit Java

Moin,

da ich gerade mal wieder mit StartSSL rumspiele. Java selber kennt StartSSL nicht, daher werden entsprechende Downloads von Java mit einer Exception quittiert. Die Suche hat mich auch Nerven gekostet, da alle Beispiele darauf abzielten, den CA von StartSSL im Rechner zu installieren. Und da wundert sich die Informatiker Welt, das keiner Verschlüsselung verwendet - naja:

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

/**
 * http://www.böses-forum.org/netzwerkeprogrammierung/90833-zertifikat-automatisch-akzeptieren.html
 */
public class CustomTrustManager {

	private static X509Certificate cert1;

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

		final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
		cert1 = (X509Certificate) certificateFactory.generateCertificate(CustomTrustManager.class.getClassLoader().getResourceAsStream("res/eigenes-CA-von.StartCOM.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 { if (!certs[0].equals(cert1)) 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://treedo.de/index.php?site=system&action=apikey&email=mogel&password=12345");
//		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();
//
//	}

}

Wichtig dabei ist das man das eigene CRT seiner Seite verwendet. Im Orginalbeispiel von Fancy steht dort startssl.crt. Was mich durchaus zu vielen Fehlern führte, da ich dachte das dort das CRT von StartCOM hin muss.

aber nun gehts, danke @Fancy , mogel

naja … auch wenn StartSSL den vorteil hat das es kostenfrei ist und in nem normalen browser auch als gültig anerkannt wird weil dort meist das root-CA installiert ist … denke ich doch das es gute gründe gibt warum sich oracle dazu entschieden hat das root-CA java nicht standardmäßig beizulegen

warum das jedoch so ist müsste man vielleicht mal direkt bei oracle anfragen

als “lösung” einfach einen eigenen trust-manager nuzen … naja … da kann man auch gleich sein eigenes CA erstellen … dann hat man den aufwand mit startcom nicht

nach dem was ich im Internet gefunden habe, waren entsprechende Absprachen mit Sun vorbereitet, bis Oracle Sun geschluckt hat. Oracle hat sich nicht weiter darum gekümmert.

Jain, der eigentliche Sinn von SSL ist die Verschlüsselung zwischen Client und Server. Das einige Firmen das Ding bis zur Bezahlvariante mit Auth aufbohren ist so eigentlich nicht vorgesehen. Das Gute daran ist das man mehr oder weniger sicher sein kann auch wirklich mit dem entsprechenden Server verbunden zu sein. Um mal ganz ehrlich zu sein - ich prüfe nicht mal bei meiner Bank ob ich auf der richtigen Seite bin. Das kann ich auch gar nicht - Man-in-the-Middle. Wie soll da Otto das Ganze prüfen?

Damit der Browser nicht mault, eben ein SSL Zertifikat welches der Browser prüfen kann. Im Programm selber kann ich in der Tat ein eigenes Zertifakt verwenden und prüfen. Für mich an der Stelle ist wichtig, das ich dem Benutzer das Gefühl gebe seine Daten sind bei mir sicher und der Browser mault nicht.

Wie ist das zu verstehen? MITM ist bei SSL bzw. der zugehörigen PKI eigentlich nicht das Problem*, sondern vielmehr kompromittierte CAs oder “geknackte” private Schlüssel.

  • im Gegenteil: die PKI dient einzig und allein der Authentifizierung des Gegenüber.