2017-12-11 6 views
0

Ich weiß, dass es viele ähnliche Fragen gibt, aber ich konnte keine Hilfe in irgendeiner vorherigen Frage finden. Ich versuche, mit einem wcf-Dienst von einem Java-Client zu kommunizieren, ich verwendete die automatisch generierten Stubs, die von Netbeans erstellt wurden, um das zu erreichen. Der Dienst wcf ist durch TLS (1.2) mit der Client-Zertifikat-Authentifizierung geschützt. Ich kann es nicht schaffen, den SunMSCAPI-Anbieter zu verwenden (dh ich möchte den lokalen Windows-Benutzerspeicher verwenden, um das Zertifikat als Client zu verwenden. Wenn es einen anderen Weg oder eine andere Bibliothek gibt, um lokale Zertifikate zu verwenden) . mir)SunMSCAPI funktioniert nicht beim Aufruf von wcf

Diese SSL-Kontext funktioniert nicht den Web-Service zu nennen:

IService servicePort = service.getWSHttpBindingIService(); 

SSLContext sslContext = SSLContext.getInstance(sslVersion); 

**KeyStore keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI"); 
keystore.load(null, null);** 

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 

kmf.init(keystore, null); 

KeyManager[] keyManagers = kmf.getKeyManagers(); 

sslContext.init(keyManagers, null, null); 

BindingProvider bindingProvider = ((BindingProvider) servicePort); 

bindingProvider.getRequestContext() 
.put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory",sslContext.getSocketFactory()); 

der Fehler i erhalten wird, wenn das Debuggen ich die Tasten sehen können und die Zertifikate im KeyManagers Array richtig:

com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 403: Forbidden 
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:310) 
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:259) 
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:217) 
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:130) 
    at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:124) 
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:1121) 
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:1035) 
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:1004) 
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:862) 
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:448) 
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:178) 
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93) 
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77) 
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147) 

die pfx ist in uns installiert äh lokales Geschäft korrekt, weil ich es in C# benutzte und es viele Male arbeitete.

im Java-Code oben auch, wenn ich pfx direkt statt SunMSCAPI Provider verwenden, funktioniert es:

KeyStore ks = KeyStore.getInstance("pkcs12"); 

ks.load(pfxStream, pfxPassword.toCharArray()); 

kmf.init(ks, pfxPassword.toCharArray()); 

ich Windows benutze, 10. jede Hilfe appriciated würde.

ich die SunMSCAPi Idee auf den folgenden Link bekommen: Digital Signature SunMSCAPI provider & MS Crypto API

+1

Beachten Sie, dass, wenn der Server eine 403 dann die SSL-Verbindung stablished wurde zurückkehrt. Ist das Client-Zertifikat optional? Ich schlage vor, die SSL-Verbindung zu debuggen, um zu überprüfen, ob der Windows-MY-Keystore korrekt gefunden wird -Djavax.net.debug = all – pedrofb

+0

Danke pedrofb, ja, ich tat es, und es sieht so aus, als würde es die Windows-my sehen. – RaniDevpr

Antwort

0

Es sieht aus wie das Problem war, dass es viele Zertifikate in meinem localstore ist und nach meinen Recherchen KeyManager die erste Taste wählt, dass die Kriterien erfüllen, gefunden, was bedeutet, dass es nicht unbedingt mein Zertifikat unter ihnen auswählen wird. Ich habe dieses Problem gelöst, indem ich einen Decorator über X509KeyManager erstellt habe, der meinen gewünschten Zertifikatalias auswählt. habe die Idee von diesem QA:

How I can tell alias of the wanted key-entry to SSLSocket before connecting?

Verwandte Themen