# SSLHandshakeException bei PKCS12



## rad238 (14. Sep 2007)

Hallo,

Ich komme mit einer Anfängerfrage ins Forum.^^

Mein Problem:
Ich möchte aus der Anwendung heraus den Inhalt einer bestimmten Webseite über https herunterzuladen. Dafür ist ein bestimmtes p12 Zertifikat nötig, welches mir als .p12-Datei vorliegt.

Was bisher geschah:
Zunächst habe Systemvariablen entsprechend meiner .p12-Datei gesetzt. Dann öffne ich eine URLConnection zur Webseite. Beim Versuch einen InputStream der URLConnection zu öffnen tritt eine SSLHandshakeException auf. 
Um ein Zertifikatsfehler auszuschließen habe ich die .p12-Datei in den Firefox importiert. Nach dem Import kann ich die Seite mit Firefox öffnen. Nur meine Java-Anwendung kann das nicht. 

Mein Code:

```
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class HttpsReader {

	final static String KEYSTORE_FILE = "PfadZurDatei.p12";
	final static String PASSWORD = "Passwort";

	final static String SERVER_URL = "https://url.de/name";

	public static void main (String[] args) {

		// trust store
		System.setProperty("javax.net.ssl.trustStore", KEYSTORE_FILE);
		System.setProperty("javax.net.ssl.trustStorePassword", PASSWORD);
		System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
		// key store
		System.setProperty("javax.net.ssl.keyStore", KEYSTORE_FILE);
		System.setProperty("javax.net.ssl.keyStorePassword", PASSWORD);
		System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

		try {
			// connection to web page
			URL url = new URL( SERVER_URL ); 
			System.out.println("open connection");
			URLConnection connection = url.openConnection(); 

			// open input stream for web page download
			System.out.println("get stream");
			InputStream stream = connection.getInputStream(); 
			System.out.println("create reader");
			BufferedReader reader = new BufferedReader(
					new InputStreamReader( stream )
			);

			// read and buffer web page
			StringBuffer webPage = new StringBuffer(); 
			String line;
			System.out.println("read line by line");
			while ( (line=reader.readLine()) != null) { 
				webPage = webPage.append( line ); 
				System.out.println(line); 
			} 

			// close
			System.out.println("close.");
			reader.close(); 
			stream.close(); 
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}
```

Meine Ausgabe auf der Konsole und die Exception:

```
open connection
get stream
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
...
```

Über Hilfe oder Anregungen würde ich mich sehr freuen.

Viele Grüße,
Andreas


----------



## Murray (14. Sep 2007)

rad238 hat gesagt.:
			
		

> Zunächst habe Systemvariablen entsprechend meiner .p12-Datei gesetzt.



Vermutlich musst du das p12-Zertifikat mit dem keytool in den Keystore importieren; die *.p12-Date selbst ist kein Keystore-File.


----------



## rad238 (14. Sep 2007)

Gefahr erkannt, Gefahr gebannt! 

Weil ich mir nicht sicher war, ob ich die keyStore-Variable oder die trustStore-Variable auf meine .p12-Datei setzten sollte, hatte ich einfach beide gesetzt. Das war falsch. In diesem Fall darf ich nur die keyStore-Variable auf meine .p12-Datei setzten, trustStore lasse ich unberührt. Dann funktioniert es.

@Murray: Trotzdem Danke für die Antwort, das hatte ich auch mal versucht. Aber zumindest hier es geht auch direkt mit der .p12-Datei.

LG,
Andreas


----------

