2017-05-10 12 views
0

httpプロキシトンネル経由でいくつかのhttps soapサービスにアクセスする必要があります。ですから、私はorg.apache.http.impl.client.ProxyClientを使ってプロキシ・トンネル経由でターゲット・ホストに接続しています。これは私にプロキシサーバー経由でターゲットホストに接続されたソケットを返します。返されたソケットはターゲットシステムに正しく接続されています。今私はターゲットシステムでホストされている石鹸サービスを呼び出す必要があります。 しかし、私は無知ですどのようにソケットを介してこれらのhttpsサービスにアクセスできます。以下は私のサンプルプログラムです。 FAIL FAIL のContent-Type:テキスト/
HTTP/1.1 400エラー X-裏面交通下記のエラー応答を取得し、上記のコードでは https://XX.XX.XX.XX:44330/sampleService/1.0org.apache.http.impl.client.ProxyClientを使用したプロキシトンネル経由のHTTPS Webサービスへのアクセス

public static void proxyTunnelDemo(String url,String soapRequestBody) throws IOException, HttpException { 
    ProxyClient proxyClient = new ProxyClient(); 
    HttpHost target = new HttpHost("XX.XX.XX.XX", 44330); 
    HttpHost proxy = new HttpHost("YY.YY.YY.YY", 9293); 
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("********", "********"); 
    Socket socket = proxyClient.tunnel(proxy, target, credentials); 

    // Need to access Web service through socket . 
    // request method GET 
    // PORT = 44330 
    // url = https://XX.XX.XX.XX:44330/sampleService/1 
    //soapRequestBody = soap message needs to be sent. 
String SOAP_CREDENTIALS = "*********"; 
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault(); 
    SSLSocket sslSocket = (SSLSocket)factory.createSocket(socket, target.getHostName(), target.getPort(), true); 
    sslSocket.startHandshake(); 

try { 


     //Send header 
     BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream(), StandardCharsets.UTF_8)); 
     String authorization = new BASE64Encoder().encode(SOAP_CREDENTIALS.getBytes()); 
     // You can use "UTF8" for compatibility with the Microsoft virtual machine. 

     wr.write("GET/HTTP/1.1\r\n"); 
     wr.write("Host: "+target.getHostName()+"\r\n"); 
     wr.write("Content-Length:"+ soapRequestBody.length() + "\r\n"); 
     wr.write("Content-Type: text/html\"\r\n"); 
     wr.write("SOAPAction:"+url+"\r\n"); 
     wr.write("Authorization: Basic "+authorization+"\r\n"); 
     wr.write("\r\n ");   //Send data 
     wr.write(soapRequestBody); 
     wr.flush(); 

     BufferedReader in = new BufferedReader(
       new InputStreamReader(sslSocket.getInputStream(), StandardCharsets.UTF_8)); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 

    } finally { 
     socket.close(); 
     sslSocket.close(); 
    } 
} 

を呼び出す必要がサービスの サンプルURL XML 接続:あなたはすでにポート44330.次のXX.XX.XX.XXとの接続を確立している

答えて

0

近いあなたはこの

ようのSSLSocketにこのソケットを渡す必要があります3210
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault(); 
SSLSocket sslSocket = (SSLSocket)factory.createSocket(socket, host, port, true); 

次にあなたがウェブサーバ

socket.startHandShake(); 

でSSLハンドシェイクを行い、その後、ソケット、ここ

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

全例から読み取り/書き込みにPrintWriterを使用することができます。

https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sockets/client/SSLSocketClientWithTunneling.java

+0

編集済みあなたの答えに応じて。しかし、エラー応答を得る。更新された投稿を確認してください。 – Angshuman

+0

@AngshumanそれはあなたがIBM Datapower Soap APIと思われるかもしれないWebサービスと話すことができるように見えます。サーバサイドのレスポンスコード400を取得しています。私が推測すると、あなたの石鹸リクエストは悪いです。しかし、これはこのスレッドには関係ありません。あなたの元の質問が解決された場合、答えを受け入れてください、または部分的に解決されている場合は、upv​​ote –

関連する問題