0

PCRFへのsoapリクエスト/ PCRFからのレスポンスを管理するWSベースのエージェントを実装しています。接続はhttpsポートを介して行われ、Java Key Store(キーストアツール)を使用して、信頼できる証明書からキーストアファイルを生成します。接続は正常に見えますが(認証が成功したかどうかはわかりません)、返される情報(応答)は読み取り不可能な短い文字列です。

SoapUIアプリを介した同じ手順は問題なく機能しています。

両方の手順の唯一の違いは、1つ目はキーストアを使用し、2つ目は信頼できる証明書を使用していることです。

どうすればそれを解決できますか?どこが悪いのかわかりません。

それが役立つなら、SOAPメッセージの送信者とPSRFから受信した応答に使用されるJavaソースを、SoapUIと実装されたWSに共有できます。

package SOAPSender;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class DebugMain {

    public static void main(String[] args) {
        //PCRFProvisioningAgent temp = new PCRFProvisioningAgent(); 

            loadKeyAndTrustStore();

            StringBuffer outputStream = new StringBuffer();
            BufferedWriter wr = null;
            BufferedReader rd = null;
            Socket sock = null;
            String outputBuffer = null;

            try {

                // Create socket
                sock = new Socket("10.96.227.219", 8080);

                // Create header
                wr = new BufferedWriter(new OutputStreamWriter(
                        sock.getOutputStream(), "UTF-8"));

                String xmlData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:rm=\"rm:soap\">"+
                           "<soapenv:Header/>"+
                           "<soapenv:Body>"+
                              "<rm:getSubscriber>"+
                                 "<inPara>"+
                                    "<subscriber>"+
                                       "<attribute>"+
                                          "<key>USRIDENTIFIER</key>"+
                                          "<value>284090000000004</value>"+
                                       "</attribute>"+
                                    "</subscriber>"+
                                 "</inPara>"+
                              "</rm:getSubscriber>"+
                           "</soapenv:Body>"+
                        "</soapenv:Envelope>";              

                wr.write("POST https://10.96.227.219:8080/axis/services/ScfPccSoapServiceEndpointPort HTTP/1.1\r\n");
                wr.write("User-Agent: https://10.96.227.219:8080/axis/services/ScfPccSoapServiceEndpointPort\r\n");
                wr.write("Content-Length: " + xmlData.length() + "\r\n");
                wr.write("Content-Type: text/xml;charset=UTF-8\r\n");
//              wr.write("SOAPAction: \"rm:soap/ScfPccSoapServiceEndpoint/getSubscriberRequest\"\r\n");
                wr.write("SOAPAction: \"\"\r\n");
                wr.write("\r\n");

                // Send data
                wr.write(xmlData);
                wr.flush();

                // Read response
                // exception handler - when connection is reset instead of close
                // after sending a packet from source
                char cbuf[] = new char[4096];
                int i = 0;
                // buffer is sized to max 4096 packet size

                try {
                    rd = new BufferedReader(new InputStreamReader(
                            sock.getInputStream(), "UTF-8"));
                    while ((i = rd.read(cbuf)) != -1) {
                        outputStream.append(cbuf, 0, i);
                        int contStartIndex = outputStream.toString().indexOf(
                                "Content-Length: ")
                                + "Content-Length: ".length();
                        int contEndIndex = outputStream.toString().indexOf("\n",
                                contStartIndex) - 1;
                        if (outputStream.toString().indexOf("Content-Length: ") != -1) {
                            int contLength = Integer.valueOf(
                                    outputStream.toString().substring(
                                            contStartIndex, contEndIndex))
                                    .intValue();
                            int headerLength = outputStream
                                    .toString()
                                    .substring(
                                            0,
                                            outputStream.toString().indexOf(
                                                    "\n\r\n")).length() + 3;
                            // if the message body is complete but there is not an
                            // ending character
                            // while will break
                            // warning - with national characters! content length is
                            // count of bytes not chars
                            if (i - headerLength >= contLength)
                                break;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("--------\n" + String.valueOf(cbuf)
                        + "\n--------------");
                outputBuffer = outputStream.toString();

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (wr != null)
                        wr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (rd != null)
                        rd.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (sock != null)
                        sock.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }

    private static void loadKeyAndTrustStore() {
        try {
            // System.out.println(Constants.ROOT_PATH + Constants.STORE_FILE);
            // AdminLogger.error("Certificate file: " + Constants.ROOT_PATH
            // + Constants.STORE_FILE);

            // System load ssl the file of certificate
            // Load Key store

            System.out.println(System.getProperty("javax.net.ssl.keyStoreType"));
            System.setProperty("javax.net.ssl.keyStoreType", "****");
            System.out.println(System.getProperty("javax.net.ssl.keyStoreType"));

            System.out.println(System.getProperty("javax.net.ssl.keyStore"));
            System.setProperty("javax.net.ssl.keyStore",
                    "****");
            System.out.println(System.getProperty("javax.net.ssl.keyStore"));

            System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));
            System.setProperty("javax.net.ssl.keyStorePassword", "****");
            System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));


            // TrustStore

            System.out.println(System.getProperty("javax.net.ssl.trustStore"));
            System.setProperty("javax.net.ssl.trustStore",
                    "****");
            System.out.println(System.getProperty("javax.net.ssl.trustStore"));

            System.out.println(System.getProperty("javax.net.ssl.trustStorePassword"));
            System.setProperty("javax.net.ssl.trustStorePassword", "****");
            System.out.println(System.getProperty("javax.net.ssl.trustStorePassword"));

        } catch (Exception ex) {
            // AdminLogger.error(ex, "StartupServlet.loadKeyAndTrustStore");
        }
    }

}

これは応答です:

...そしてこれがSoapUIアプリからの応答です:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <getSubscriberResponse xmlns="rm:soap">
         <result xmlns="">
            <resultCode>12302</resultCode>
            <paras>
               <key>errorDescription</key>
               <value>The subscriber does not exist.</value>
            </paras>
         </result>
      </getSubscriberResponse>
   </soapenv:Body>
</soapenv:Envelope>
4

2 に答える 2

1

ソケットは、Java から Web サービスを呼び出す理想的な方法ではありません。JAX-WS などの Java API を使用してください。PSRF Web サービスから WSDL を取得し、ws-import コマンドを使用してクライアント スタブを生成します。

セキュリティに関しては、JAX-WS セキュリティ API を使用して、WS-Security で保護された Web サービスを呼び出す必要があります。

このスレッドを参照してください - jax-ws-using-web-service-with-ws-security-and-ws-addressing

ありがとう、スリーハリ。

于 2012-06-12T13:38:25.050 に答える
0

@sreehari が指摘したように、ソケットは Web サービスの呼び出しには理想的とは言えません。基本的に、アプリケーション プロトコル (HTTP/S など) の関連するすべての詳細を自分で実装する必要があります。それ自体が途方もない事業です。

「低レベル」のままにして、自分でリクエストを作成したい場合は、HttpsUrlConnection を使用するように「アップグレード」することをお勧めします。

于 2012-06-12T13:49:01.313 に答える