HTTP Zertifikat automatisch akzeptieren

Status
Nicht offen für weitere Antworten.

ukbimbie

Mitglied
Hallo zusammen,

ich habe vor einiger Zeit ein Projekt übernommen, dass ich in mühseliger Arbeit in Eclipse zum Laufen bekommen habe. Das Projekt verbindet sich via einer HTTPS-Klasse zu einem Servlet auf einem Tomcat-Server.

Das Problem ist, dass ich beim Verbinden von meiner Testmaschine zum Server folgenden Fehler bekomme:
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

Nun gibt es Tools, um das Zertifikat in die cacerts-Datei von Java zu laden. Auf meiner Testmaschine ist das auch kein Problem. Beim Kunden soll das nachher aber automatisch geschehen.
Gibt es eine Möglichkeit das über den Source-Code zu arrangieren, dass der Kunde nur noch auf "Zertifikat akzeptieren" klickt und das Programm dann automatisch connectet?

Gruß
Christopher
 
Schau Dir mal diesen Blogeintrag an. Das Programm InstallCert hat mir auch schon ganz gut geholfen, da kannst Du sicher was rausziehen.
 
Hi musiKk,

ja, das Programm kenne ich schon und habe ich bisher auch verwendet. Aber ich möchte nachher beim Kunden nicht immer diese Installation durchführen müssen. Stattdessen soll das Zertifikat gewissermaßen automatisch akzeptiert werden bzw. durch den Benutzer im Programm akzeptiert werden.
Gibt es dafür einen Weg?

Gruß
Christopher
 
Na das Programm ist doch schon darauf ausgelegt. Da musst Du ja nur den Kern rausziehen und deine GUI drumherum basteln.
 
Hi musiKk,

ja, das Programm kenne ich schon und habe ich bisher auch verwendet. Aber ich möchte nachher beim Kunden nicht immer diese Installation durchführen müssen. Stattdessen soll das Zertifikat gewissermaßen automatisch akzeptiert werden bzw. durch den Benutzer im Programm akzeptiert werden.
Gibt es dafür einen Weg?

Gruß
Christopher
Ich als Kunde würde nicht wollen, dass mit dem Programm auch gleich das Zertifikat installiert wird, dem ich somit ohne meines Wisssens vertraue.
 
Ich als Kunde würde nicht wollen, dass mit dem Programm auch gleich das Zertifikat installiert wird, dem ich somit ohne meines Wisssens vertraue.
Du weißt nicht, um was für eine Anwendung es geht und um welchen Personenkreis es sich bei den Kunden handelt. Du gehörst sicher nicht dazu, von daher kannst du das auch überhaupt nicht beurteilen. Den Kunden interessiert es nen Dreck, wie die Verbindung gesichert ist und über welches Zertifikat. Der will, dass der Mist funktioniert und damit Basta.

Bleibt also die Frage: Wie kann ich im Programm das Zertifikat akzeptieren?
 
Moin,

wenn Du nicht auf diese merkwürdigen oreilly Klassen angewiesen bist, sondern stattdessen die Java API verwenden kannst, kannst Du einfach einen neuen TrustManager einhängen und über diesen die Verbindung gegen ein vertrauenswürdiges Zertifikat prüfen.
(Und Du musst vor allem den TrustStore des Kunden nicht anfassen!)

Quick and dirty:

Java:
package late;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class CustomTrustManager {

	private static final String trustedCertPath	= "late/startssl.crt";
	private static X509Certificate	trustedCert;

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

		final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
		trustedCert = (X509Certificate) certificateFactory.generateCertificate(CustomTrustManager.class.getClassLoader().getResourceAsStream(trustedCertPath));

		
		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(trustedCert))
					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", "www.startssl.com", 443, "/");

		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();

	}

}

Gruß,
Fancy
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben