SSL Client javax.net.ssl.*

Mindwinder

Mitglied
Schönen guten Abend,
ich versuche mittels Java einen Client zu basteln, welcher sich gegenüber dem Server unter anderem mittels Zertifikat authentifiziert, folglich muß ich ja meinen Key und das Zertifikat irgendwie von Java benutzen lassen - hatte gelesen, dass ich selbige dazu in den Truststore einbinden muß - wie funktioniert das? In welches (Datei-?)Format muß ich key und Zertifikat dazu bringen?

Des Weiteren funktioniert meine Klasse nicht so wie erwartet - folgende Fehlermeldung:
java.lang.RuntimeException: error instantiating default socket factory: java.security.NoSuchAlgorithmException: SSLv3

Ich habe mit Java bislang wenig bis gar nix gemacht, heißt das dass der Server auf SSLv3 kommuniziert und Java kann dies (noch) nicht? Habe lediglich das FREE-SDK installiert, fehlt mir irgendetwas? Oder liegt das einfach am fehlenden Zertifikat? Wäre schön wenn sich meiner jemand annehmen könnte.

javax.net.ssl.* ist eingebunden sowie java.net.* und java.io.*
Socket wird folgendermaßen versucht zu initialisieren:
Code:
	         SSLSocketFactory factory =
	           (SSLSocketFactory) SSLSocketFactory.getDefault();
	         s = factory.createSocket(host,PORT);

Nette Grüße,

Mindwinder
 
Hy Mindwinder,
wie weit bist du denn schon mit deine Stores? Hast du schon einen Keystore mit Schlüsselpaar angelegt, einen Certification-Request erstellt und es selbst oder von einer CA zertifizieren lassen?
Wenn ja brauchst du die .cer Datei des von der CA zertifizierten Zertifikats und musst sie in deinen Keystore mit dem Schlüssel einbinden. Wichtig ist das du beim importieren den Alias deines Schlüsselpaares angibst damit eine Certification-Chain erstellt wird.

Du kannst für Java deinen Store sowohl als Key- wie auch als Truststore nutzen. Aber du musst in Java die System-Properties so setzen das dein Programm weiß wo es den oder die Stores findet. Passiert wie folgt:

Code:
	    System.setProperty("javax.net.ssl.keyStore", pathToKeystore );
	    System.setProperty("javax.net.ssl.keyStorePassword",passForKeystore);
	    System.setProperty("javax.net.ssl.trustStore", pathToKeystore);
	    System.setProperty("javax.net.ssl.trustStorePassword",passForKeystore);
Bei dem Beispiel habe ich Pfad zum Store und Passwort als Strings in Variabeln gelegt.

Nun sucht dein Programm nicht in dem Java eigenem Verzeichniss für Zertifikate sondern benutzt automatisch deinen Keystore für die Verbindung.

Was deinen Fehler angeht weiß ich es gerad nicht genau, ob es an den Schlüsseln liegt, vielleicht ist dein Fehler schon verschwunden wenn du den Store auf beiden Seite mit dem richtigen Zertifikaten einbindest, falls nicht sag bescheid, Dann erklär ich dir wie du dir deinen eigenen SSL-Context bastelst... ;)

Falls du die Sache mit den Stores und Keys noch nicht hast dann sag auch bescheid, allerdings wird der Post dann um einiges länger...

Grüße
Sascha
 
Hallo Zusammen,

Ich habe mich nun bereits mit mehreren Tutorials herumgeschlagen und noch keine laufende Version hinbekommen. Normale Ldap funktionen funktionieren bis jetzt - mit SSL (und allenfalls Certificate-based authentication) jedoch nicht.

Als erstes die Frage:
Muss JSSE zusätzlich installiert werden? Wenn ich "javax.net.ssl." in Netbeans(6.9.1) eingebe, gibt es zwar einige Methoden aber "trustStore", "keyStore" etc. nicht. Ist JSSE nicht bereits integriert?

Als LDAP habe ich DSEE7. Dort hat es ein Default Certificate. Muss ich nun von diesem Default Certificate bloss den Public Key in ein .PEM File umwandeln
("openssl pkcs12 -in LDAP_cert -out LDAP_pk.pem -clcerts -nokeys")
und diesen in einem Keystore ablegen?
("keytool -import -file LDAP_pk.pem -keystore newKeystore").

Für alle Hilfe wäre ich grottenfroh. Habe nun genügend Stunden investiert und nichts herausbekommen.

Gruss PAWI
 
Zurück