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
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
Danke pedrofb, ja, ich tat es, und es sieht so aus, als würde es die Windows-my sehen. – RaniDevpr