2012-08-07 11 views
6

Ich habe einen Web-Service mit gegenseitiger SSL-Authentifizierung. Ich kann im Browser gut darauf zugreifen, wenn ich das Client-Zertifikat installiert habe.Wie wird wsimport verwendet, wenn der Server Clientzertifikat erwartet?

Ich muss in der Lage sein, mit wsimport für die Generierung der Java-Code für den Zugriff auf den Dienst zugreifen.

Wie kann ich meine Anmeldeinformationen einrichten, sodass ich unter Verwendung der wsimport auf die URL zugreifen kann?

Hier ist ein Beispiel für das, was ich versuche, aber es ist wegen der Unfähigkeit zu authentifizieren.

wsimport ./sample.wsdl -p com.company.ws.sample -Xnocompile -d ./src -extension -keep -XadditionalHeaders

Vielen Dank für jede Hilfe

Edit:

Dies ist, was wsimport druckt. Die WSDL ist auf jeden Fall gültig ist, und an der angegebenen Stelle, ist es eine Frage von herauszufinden, wie in meinen Anmeldeinformationen zum Authentifizieren weitergeben müssen:

wsimport https://wsdl.location.com?WSDL -p com.company.ws.sample -Xnocompile 
-d ./src -extension -keep -XadditionalHeaders 


parsing WSDL... 

[ERROR] Received fatal alert: handshake_failure 

Failed to read the WSDL document: "https://wsdl.location.com?WSDL", because 1) could 
not find the document; /2) the document could not be read; 3) the root element of 
the document is not <wsdl:definitions>. 

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

At least one WSDL with at least one service definition needs to be provided. 

    Failed to parse the WSDL. 
+0

sharing the error/exception stacktrace, dem Sie gegenüberstanden, hilft anderen, das Problem zu verstehen. – sundar

+0

Ich habe den Beitrag aktualisiert, um mehr Details anzuzeigen. Danke – Cuga

+0

http://ibswings.blogspot.in/2008/12/running-axis-wsdl2java-on-https-wsdl.html versuchen Sie dies – sundar

Antwort

8

Sie können direkt die wsimport Java-Klasse aufrufe (source) und fügen Sie die JVM erforderlich Args für Java, um zu wissen, wo nach Client-Zertifikaten gesucht werden soll.

So etwas wie

java -classpath C:\jdk160_29\lib\tools.jar -Djavax.net.ssl.trustStore=c:\jdk160_29\.mykeystore com.sun.tools.internal.ws.WsImport https://host:8443/Webservice?wsdl -p com.test -s ./src" 

sollte es tun.

+2

es soll den Trick tun +1 – RamonBoza

+0

Failed für ich mit einem 'Exception in thread" main "java.lang.NoSuchFieldError: theInstance', aber ich habe eine Alternative gefunden. –

3

Ich habe dies erreicht, indem ich die Umgebungsvariable _JAVA_OPTIONS mit all den zusätzlichen Systemeigenschaften gesetzt habe, die durchlaufen werden müssen; als Datei Windows-Batch sieht es so aus (Ihr Passwort entsprechend setzen:

setlocal 
set _JAVA_OPTIONS=%_JAVA_OPTIONS% -Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} -Djavax.net.ssl.keyStore=r:\cert.pfx 
wsimport -s . -verbose https://your.host.name/path/to/service?wsdl 
endlocal 

Für geistige Gesundheit willen, die Java-Optionen in der langen ‚Set‘ Linie sind:

-Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" 
-Djavax.net.ssl.keyStoreType=PKCS12 
-Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} 
-Djavax.net.ssl.keyStore=R:\cert.pfx 

Sie können oder Möglicherweise muss ich nicht die trustStore Einstellung specifift; Ich musste, wie ich ein paar Installationen auf und Java hatte die falsche cacerts Datei für mich abholen.

Ebenso werden Sie die keyStorePassword nicht benötigen, wenn der Schlüsselspeicher isn Passwortgeschützt, wie für keyStoreType müssen Sie dies angeben, wenn Sie nicht auf einen Java-Keystore zugreifen. Die einzige "obligatorische" Option ist keyStore, die definiert, wo das Clientzertifikat und die Schlüssel leben (und es ist nur dann zwingend erforderlich, wenn das Clientzertifikat nicht in einem der Kern-Java-Zertifikatspeicher vorhanden ist). Das obige Beispiel bezieht sich auf ein Clientzertifikat in einer PFX-Datei, das durch den Export aus dem Windows-Zertifikatspeicher generiert wurde.

2

Ich fand viel einfacher (keine Notwendigkeit zu spielen mit -D, Klassenpfad, ...) zu:
1. Laden Sie die WSDL über SSL mit Ihrem Browser (installieren Sie das Zertifikat in Ihrem Standard-Browser durch Doppelklick auf der Keystore) oder noch einfacher mit soapUI (installieren Sie den Keystore über Config/ssl), die den WSDL Inhalt zeigt
2. Führen Sie den wsimport gegen die heruntergeladene WSDL
Das ist alles.

Verwandte Themen