0

安全なクライアントを使用して Web サービスにアクセスしようとしています。

2 つのファイルを生成しました。

nb19200.pkcs12

サーバー.jks

サーバーのキーストアを tomcat に貼り付け、pkcs12 をブラウザーにアップロードしました。すべて正常に動作します。

ここで、クライアント アプリケーションで次のことを試しました。

まず、サーバー証明書をエクスポートします。次のコマンドを使用しました。

keytool -exportcert -alias servercert -file servercert.cer -keystore server.jks -storepass * *

そして、何も入っていないキーストアにインポートします。

keytool -importcert -keystore truststore.jks -alias servercert -file servercert.cer -v trustcacerts -noprompt -storepass * **

私のコードは次のとおりです。

    System.setProperty("javax.net.ssl.trustStore","servertrust.jks");
    System.setProperty("javax.net.ssl.trustStorePassword", "password");

    //To be able to load the client configuration from axis2.xml
    ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem("client-repo", null);

    SecureServiceStub stub = new SecureServiceStub(ctx,"https://localhost:8443/axis2/services/SecureService");

    ServiceClient sc = stub._getServiceClient();

    sc.engageModule("rampart");

    //call the service etc.

OK、この構成では次のエラーが発生します。

原因: java.net.SocketException: 接続がリモート ホストによって閉じられました

最初の 2 行にコメントを付けると、次のエラーが表示されます。

原因: sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりません

それで、私は何を間違っていますか?

私は完全に迷っています。

完全なコードを更新:

http://pastebin.com/8xTYK3tY

スタックトレース:

Exception in thread "main" org.apache.axis2.AxisFault: Connection refused: connect
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:197)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at tutorial.rampart.client.SecureServiceStub.add(SecureServiceStub.java:191)
at tutorial.rampart.client.SecureServiceCGClient.main(SecureServiceCGClient.java:36)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:564)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:130)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
4

3 に答える 3

1

キーストア パスを定義する行を見てください。

System.setProperty("javax.net.ssl.trustStore","servertrust.jks");

しかし、ファイル名はserver.jksだとおっしゃいました。その場合、コードが適切な証明書ファイルを見つけることができないのはそのためです。

アップデート:

SSL (https) を使用する場合、サーバーは「CN」に基づいて正しい証明書を検索します。CN は、ホストの名前と同じでなければなりません。投稿した URL によると、localhost を使用していることがわかります。そのため、CN をマシン名と同じにする必要があります ([マイ コンピューター] -> [プロパティ] を右クリックすると表示されます)。

于 2012-06-21T11:23:58.343 に答える
0

私は解決策を見つけました。

私はこれを逃していました:

System.setProperty("javax.net.ssl.keyStore","keys/client.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
于 2012-06-22T14:22:23.510 に答える
0

サービスがポート 8443 でリッスンしていることを確認してください。URLhttps://localhost:8443/axis2/services/SecureServiceが存在することを確認してください。この URLhttps://localhost:8443/axis2/services/SecureService?wsdlを試して、その URL からサービスの WSDL を取得できるかどうかを確認してください。

于 2012-06-22T13:03:58.310 に答える