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
 

musiKk

Top Contributor
Schau Dir mal diesen Blogeintrag an. Das Programm InstallCert hat mir auch schon ganz gut geholfen, da kannst Du sicher was rausziehen.
 

ukbimbie

Mitglied
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
 

musiKk

Top Contributor
Na das Programm ist doch schon darauf ausgelegt. Da musst Du ja nur den Kern rausziehen und deine GUI drumherum basteln.
 

FArt

Top Contributor
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.
 

ukbimbie

Mitglied
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?
 
G

Gast

Gast
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
x46 Java SSLContext erstellen mit SSL-Zertifikat Netzwerkprogrammierung 1
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
H p12 zertifikat in eigenen KeyStore importieren Netzwerkprogrammierung 2
K HTTPS Zertifikat Netzwerkprogrammierung 3
Weiti HTTP Zertifikat-Probleme - InstallCert.java Netzwerkprogrammierung 2
musiKk SSL-Verbindung mit Client-Zertifikat (Private Key) scheitert Netzwerkprogrammierung 13
A SSL Zertifikat - modulus auslesen und vergleichen Netzwerkprogrammierung 1
P JNDI LDAP-SSL Verbindung, Zertifikat wird nicht angezeigt ? Netzwerkprogrammierung 2
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
G SSL Verbindung ohne Zertifikat Netzwerkprogrammierung 9
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
C SMTP-Host automatisch ermittlen Netzwerkprogrammierung 15
L webformular automatisch erstellen, senden und auswerten . Netzwerkprogrammierung 2
D Server schliesst sich automatisch mit Client Netzwerkprogrammierung 3
M webseite automatisch ausfüllen und abschicken Netzwerkprogrammierung 2
Tom079 Zertifikate automatisch annehmen. Netzwerkprogrammierung 2
W Automatisch Email senden Netzwerkprogrammierung 4
O Per POST automatisch auf Website einloggen... Netzwerkprogrammierung 9
G Verbindungswünsche nur von bestimmten IPs akzeptieren Netzwerkprogrammierung 12
T Proxy will einfach nicht mein prog akzeptieren Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben