wie keystore in axis einbinden?

Status
Nicht offen für weitere Antworten.

thomasK

Mitglied
Hallo,

ich finde einfach keine Antwort auf folgende Frage:

ich habe mit dem tool wsdl2Java die Proxyklassen für einen einfachen Webservice erstellen lassen. Wenn der Webservice SSL verwenden soll komme ich aber nicht wirklich weiter. Der Zugriff funktioniert, wenn ich die benötigten Zertifikate über System-Property auf keystore-files setze:

Code:
System.setProperty("javax.net.ssl.trustStore", "authWE.dat");
System.setProperty("javax.net.ssl.trustStorePassword", "w824ork");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStore", "900test.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "test");

ich möchte aber gerne die Zertifikate von einer SmartCard (eToken) auslesen. Der Zugriff auf die Smartcard funktioniert ebenfalls... ich habe ein KeyStore-Objekt das auf die SmartCard-Zertifikate zugreifen kann.

Nur wie kann ich Java/Axis dazu bringen, dieses KeyStore-Objekt zu benutzen??

(ich nutze Java 6.0 ... Axis 1.4 und die Webservice Klassen wurden von einem eclipse-Plugin erstellt)

eigentlich müsste das über
AxisProperies..setProperty("axis.socketSecureFactory", "com.prosolution.tools.MySSLFactory");

aber das wird ignoriert... der von wsdl2Java generierte Code verwendet org.apache.axis.client.Call Klasse und nirgends AxisProperties... bin wohl komplett am falschen Dampfer, oder?


Danke vielmals im Voraus für jeden Hinweis,
Thomas
 

Niki

Top Contributor
Wenn du ein KeyStore Objekt hast, kannst du es dann so laden?:
Code:
		KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
		keyStore.load(is, pwd);
		is.close();

Bei mir ist is ein InputStream welches auf einen KeyStore im FileSystem zeigt (wurde mittels portecle aus einem .cer-File generiert)
Das setzen von irgendwelchen Properties war dann gar nicht mehr notwendig.
 

thomasK

Mitglied
mein code soweit

Code:
			String configName = "pkcs11.cfg";
			Provider p = new sun.security.pkcs11.SunPKCS11(configName);
			Security.addProvider(p);

			KeyStore ks = null;
			ks = KeyStore.getInstance("PKCS11");
			ks.load(null, pin);
			
			String alias = null;
			Enumeration<String> al = ks.aliases();
			while(al.hasMoreElements()) {
				alias = al.nextElement();
				System.out.println(alias);				
			}

dieses Fragment funktioniert soweit - ich bekomme im Debug alle benötigten Zertifikate. Nur bringe ich axis nicht dazu dieses KeyStore-Objekt zu benutzen...
 

Niki

Top Contributor
Code:
ks.load(null, pin);

Warum null? Woher soll er dann das Zertifikat laden? Was wird denn in der Schleife ausgegeben? Hast du das .cer File vom Server auf dem das WebService läuft? Wenn ja lass dir doch mal mittels portecle ein jks File generieren und probier es einmal damit aus. Das ist in 15 Minuten schnell getestet
 

thomasK

Mitglied
Hallo,

Danke für deine Hilfsbereitschaft.

Das Codebeispiel habe ich von Java Dokumentation 1.5. und die Auflistung gibt alle 4 Zertifikate, die sich auf dem Token befinden zurück. Ich meine also, dass dieser Code-Teil tatsächlich funktioniert.

Die Frage für mich ist wie ich die Java-Applikation (Webservice-Client) dazu bringe, bei der Verbindung diesen Token-Keystore zu verwenden.

Ich muss doch irgendwie in diesen Axis-Wrappern eine SecureSocketFactory Klasse einstellen können oder mein KeyStore und TrustStore OBJEKT setzen können (ohne das Objekt als .jks File auf Platte zu haben), oder?

wie gesagt, mit den System-Properties funktioniert ja alles, nur kann ich dort einen Verweis auf ein File mitgeben, aber nicht ein bestehendes Keystore-Objekt (soweit ich herausgefunden habe) ??
 

Niki

Top Contributor
Im Internet hab ich diese Zeilen gefunden, eventuell hilft dir das ja:

Code:
System.setProperty( "java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol" );
Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() );
 

thomasK

Mitglied
nein, leider auch keine Veränderung... habe die default security-provider um pkcs11 ergänzt und auch das hat keine Änderung gebracht...

Werde diese Sache wohl anders lösen müssen. Ich danke vielmals für die Hilfe - sollte ich noch einen funktionierenden Weg finden, dann werde ich das hier noch posten!
 

thomasK

Mitglied
Hab's jetzt hinbekommen, dass meine eigene SecureSocketFactory-Klasse geladen wird, die ein SSLContext-Objekt zurückgibt. Vor dem Aufruf der Webservice-Methoden musste lediglich diese Zeile eingefügt werden:

Code:
System.setProperty "org.apache.axis.components.net.SecureSocketFactory", "com.prosolution.tools.WorkExpertSSLFactory");

vielleicht hilft's jemand weiter...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben