# Https Verbindung wird aus jar heraus nicht aufgebaut



## Lay-C (4. Feb 2009)

Morgen,

Ich schreibe zur Zeit ein Programm, das sowohl eine unverschlüsselte (http) als auch eine verschlüsselte Verbindung zu einem Server aufbauen soll.

Direkt aus eclipse heraus funktioniert das ganze auch.
Nur mit "java -jar Programm.jar" kann ich nur eine http Verbindung aufbauen.
Bei https kommt keine Fehlermeldung aber es hängt sich einfach auf.

die Https Verbindung wird aufgebaut über 

```
SocketFactory socketFactory = SSLSocketFactory.getDefault();
	        socket = socketFactory.createSocket(host, 443);
```

Ich gebe dem Programm mit dem VMArgument 
	
	
	
	





```
-Djavax.net.ssl.trustStore="Absoluter Pfad zum keystore"
```
 den Pfad zum keystore an...

Allerdings hab ich den Befehl ja in Eclipse eingegeben. Wie gebe ich das Argument an die jar weiter?
Oder könnte es an was anderem liegen?


----------



## HoaX (4. Feb 2009)

das -D.... musst du genauso beim starten des jars mit angeben. Das wird nicht im fertigen Jar gespeichert. Du könntest aber evtl. versuchen das Property im Code von Hand zu setzen.


----------



## Lay-C (4. Feb 2009)

Hmm ok...
also da das Programm für "normale Windows User" benutzbar sein soll, kann ich keine parameter in der Konsole übergeben lassen.

würde das ganze im Programm dann so aussehen?

```
System.setProperty("javax.net.ssl.trustStore", "keys");
```

die Datei keys ist im "src" Ordner des jars, darin sind auch die packages mit den source dateien.
wenn ich die Bilder in jar://src/image/bild.png aufrufe mach ich das ja auch über "/image/bild.png"

so hab ich es nämlich jetzt und es funktioniert trotzdem nicht


----------



## Lay-C (4. Feb 2009)

Kann mir keiner helfen?
Ich finde nirgends wie das ganze funktioniert... hab schon mehrere Möglichkeiten durchprobiert:


```
System.setProperty("javax.net.ssl.trustStore", "keys");
System.setProperty("-Djavax.net.ssl.trustStore", "keys");
System.setProperty("javax.net.ssl.trustStore", "/keys");
System.setProperty("-Djavax.net.ssl.trustStore", "/keys");
System.setProperty("javax.net.ssl.trustStore", "\\keys");
System.setProperty("-Djavax.net.ssl.trustStore", "\\keys");
```

und nichts davon funktioniert...


----------



## HoaX (4. Feb 2009)

imho musst du eine korrekte url angeben wenn der keystore im jar liegt. also getClass().getResource("/keys").toString() oder so


----------



## Lay-C (4. Feb 2009)

also die keys ist jetzt im gleichen Verzeichnis wie die class Dateien und ich setze mit:


```
String s = getClass().getResource("keys").toString();
		System.out.println(s);
		System.setProperty("javax.net.ssl.trustStore",s);
```

als Ergebnis bekomm ich dann:
jar:file:/C:/Dokumente%20und%20Einstellungen/Dominik/Desktop/FIX/FIX.jar!/client/keys 

was auch der richtige Pfad ist.

Dennoch trotzdem bekomm ich den noch ne Exception die ich aber nicht lesen kann, da sich die Konsole aufhängt.


----------



## HoaX (4. Feb 2009)

Die Konsole hängt sich auf? Hab ich noch nie gesehn.

Nimm halt ein Logging-Framework und schreib die Exceptions damit in eine Datei. Wenn du uns dann die ganze Exception zeigst ...


----------



## Lay-C (4. Feb 2009)

```
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1554)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1537)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1463)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:64)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:73)
	at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259)
	at client.HttpClient.send(HttpClient.java:79)
	at client.Sender.send(Sender.java:75)
	at client.AppletFrame.actionPerformed(AppletFrame.java:137)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6134)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
	at java.awt.Component.processEvent(Component.java:5899)
	at java.awt.Container.processEvent(Container.java:2023)
	at java.awt.Component.dispatchEventImpl(Component.java:4501)
	at java.awt.Container.dispatchEventImpl(Container.java:2081)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
	at java.awt.Container.dispatchEventImpl(Container.java:2067)
	at java.awt.Window.dispatchEventImpl(Window.java:2458)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
	at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:59)
	at sun.security.validator.Validator.getInstance(Validator.java:161)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:108)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:204)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1014)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
	... 30 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
	at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:183)
	at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:103)
	at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:87)
	at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:57)
```


----------



## Lay-C (5. Feb 2009)

Kann mir keiner helfen?

Oder braucht ihr noch mehr Informationen?

Wär echt toll wenn ich das irgendwie noch hinbekommen würde


----------



## HoaX (5. Feb 2009)

also zu der fehlermeldung gibts doch mehr als genug treffer bei google. im ersten steht sogar die lösung bzw erklärung.


----------



## Lay-C (5. Feb 2009)

Hab ich auch schon gelesen. Aber entweder versteh ichs nich richtig oder ich mach was falsch...

Ich hab das Zertifikat der Seite, hab einen keyStore erstellt (eben meine keys Datei) und hab sie eingebunden (oder es zumindest versucht)

Aber irgendwie geht es trotzdem nicht.


----------



## Lay-C (5. Feb 2009)

Was mir gerade noch auffällt, woran ich vorher garnicht gedacht habe, ist, dass das ganze als Applet von dem jeweiligen Server gestartet werden soll.

Und da das ganze auf verschiedenen Servern laufen soll, kann ich ja nicht nur das Zertifikat des einen Servers mitgeben.


----------



## Lay-C (6. Feb 2009)

Ok Problem wurde gelöst, am Anfang hat nur der Pfad nicht wirklich gestimmt, und warum es dann aus dem jar heraus nicht geladen werden konnte weiß ich nicht.

jetzt muss auf dem Server halt ein Keystore existieren, aber das ist ja kein so großes Problem.


----------

