似たような質問がたくさんあることは知っていますが、これまでの質問で助けが見つかりませんでした。私はJavaクライアントからwcfサービスと通信しようとしています。これを達成するためにnetbeansによって作成された自動生成スタブを使用しました。 wcfサービスは、TLS(1.2)を使用したクライアント証明書認証で保護されています。私はそれがSunMSCAPIプロバイダを使用するように働くことはできません。(つまり、Windowsユーザーのローカルストアを使用して証明書をクライアントとして使用することを意味します(Windows証明書ローカルストアを使用できるようにする別の方法やライブラリがある場合。私)wcfを呼び出すときにSunMSCAPIが機能しない
これのSSLContextは、Webサービスを呼び出すために動作していない:
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());
私が手にエラーがデバッグ時に私が正しくKeyManagers配列のキーと証明書を見ることができ、次のとおりです。
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)
pfxがインストールされています私はC#でそれを使用し、それは何度も働いていたので、ローカルストアを正しくしました。私はSunMSCAPIプロバイダの代わりに、直接PFX使用する場合も、上記のJavaコードで
、それが動作します:私は窓10任意のヘルプを使用していますKeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(pfxStream, pfxPassword.toCharArray());
kmf.init(ks, pfxPassword.toCharArray());
にappriciatedされるだろう。
私は、次のリンクからSunMSCAPiのアイデアを得た:問題は私のlocalstoreで多くの証明書があるということでしたし、私の研究によるとのKeyManagerが最初のキーそれが基準を満たしていたの選択のように見えます Digital Signature SunMSCAPI provider & MS Crypto API
注:このQAからアイデアを得ました。クライアント証明書はオプションですか? SSL接続をデバッグして、Windows-MYキーストアが正しく検出されているかどうかを確認することをお勧めします。-Djavax.net.debug = all – pedrofb
pedrofbありがとうございます。はい、そうでしたが、Windows-myが表示されているようです。 – RaniDevpr