# wie keystore in axis einbinden?



## thomasK (30. Jul 2008)

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:


```
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 (30. Jul 2008)

Wenn du ein KeyStore Objekt hast, kannst du es dann so laden?:

```
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 (30. Jul 2008)

mein code soweit


```
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 (30. Jul 2008)

```
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 (31. Jul 2008)

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 (31. Jul 2008)

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


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


----------



## thomasK (31. Jul 2008)

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 (31. Jul 2008)

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:


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

vielleicht hilft's jemand weiter...


----------

