2013-11-26 66 views
5

我正在使用java中的web服务。此服务正在使用UserNameToken,时间戳和签名进行消息级安全性。我已经给SoapUI项目文件(xml)尝试从服务中获取数据。一切工作正常在SoapUI。在java和SOAPUI中使用Web服务

现在,当我试图使用相同的soapUI文件生成工件时,我收到一条消息"Receiver Policy falsified"。为什么我可以连接到soapUI中的服务,但是我不能在java中?

所以我发现我没有使用传输层安全性发送密钥库。我如何在SOAP请求中发送此消息。我在SSL设置中的SOAP UI中完成了类似的设置,并且可以在此工作。

这是我在Java

SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 

    String url = "https://abc.org/test/ApplicantInformationService"; // Test System Web Service URL 

SSLSocketFactory sslSocketFactory = getSSLSocketFactory(); 

conn = urlOnly.openConnection(); 
if (conn instanceof HttpsURLConnection) { 
    ((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory); 
    ((HttpsURLConnection) conn).setRequestMethod("POST"); 
} 

conn.setRequestProperty("Content-Type", "application/soap+xml;charset=UTF-8");  
conn.setDoOutput(true); 
SOAPMessage message = createSOAPRequest(user); 
ByteArrayOutputStream os1 = new ByteArrayOutputStream(); 
message.writeTo(os1); 
String requestXml = new String(os1.toByteArray()); 

OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); 
out.write(requestXml); 
out.flush(); 
if(out != null){ 
    out.close(); 
}    
String line = "";     
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
String responseNewWay = ""; 
while ((line = in.readLine()) != null) { 
    responseNewWay = responseNewWay + line; 
} 
//SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(user), url); 
//soapConnection.close(); 
//ByteArrayOutputStream os = new ByteArrayOutputStream(); 
//soapResponse.writeTo(os); 
//String responseXml = new String(os.toByteArray()); 

SOAP请求的代码和SSLFactory代码是这样的

private static SSLSocketFactory getSSLSocketFactory() 
    throws KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, IOException, KeyManagementException{ 
    SSLSocketFactory sslsf = null;     
    String keyStoreFileName = Preference.portalDir() + "mydocs/keystore.jks";   

     String keyStorePath = ClassLoader.getSystemResource(keyStoreFileName).getPath();   
    String keyStoreType = "JKS"; 
     String keyStorePassword = "mypassword"; 
     String trustStoreFileName = Preference.portalDir() + "mydocs/keystore.jks";   

     String trustStorePath = ClassLoader.getSystemResource(trustStoreFileName).getPath(); 
     String trustStorePassword = "mypassword"; 
     String alias = "clientcertificate"; 

     Properties systemProps = System.getProperties(); 
     systemProps.put("javax.net.ssl.keyStore", keyStorePath); 
     systemProps.put("javax.net.ssl.keyStorePassword", keyStorePassword); 
     systemProps.put("javax.net.ssl.keyStoreType", keyStoreType); 

     systemProps.put("javax.net.ssl.trustStore", trustStorePath); 
     systemProps.put("javax.net.ssl.trustStoreType", "JKS"); 
     systemProps.put("javax.net.ssl.trustStorePassword", trustStorePassword); 
     System.setProperties(systemProps); 

     KeyManager[] keyManagers = createKeyManagers(keyStoreFileName,keyStorePassword, alias); 
     TrustManager[] trustManagers = createTrustManagers(trustStoreFileName, trustStorePassword); 
     sslsf = initItAll(keyManagers, trustManagers); 

     return sslsf; 
    } 

和错误SOAP响应我得到是这样

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
    <soapenv:Body> 
     <soapenv:Fault> 
      <soapenv:Code> 
       <soapenv:Value>soapenv:Receiver</soapenv:Value> 
      </soapenv:Code> 
      <soapenv:Reason> 
       <soapenv:Text xml:lang="en-US">Policy Falsified</soapenv:Text> 
      </soapenv:Reason> 
      <soapenv:Role>https://abc.org/test/ApplicantInformationService</soapenv:Role> 
      <soapenv:Detail> 
       <l7:policyResult 
        status="Service Not Found. The request may have been sent to an invalid URL, or intended for an unsupported operation." xmlns:l7="http://www.layer7tech.com/ws/policy/fault"/> 
      </soapenv:Detail> 
     </soapenv:Fault> 
    </soapenv:Body> 

现在我得到这个错误

Server returned HTTP response code: 500 for URL: https://abc.org/test/ApplicantInformationService 
+0

您是否定义了任何策略集? –

+0

不,如果我使用我通过javaui代码创建的请求,在soapui中,当我应用“身份验证”时也可以工作。所以我不理解我将如何在我的java代码中应用身份验证。 – yogsma

+0

什么是您的应用程序服务器? – user1807337

回答

2

也许你必须附加“WSDL?”在URL字符串的结尾:

String url = "https://abc.org/test/ApplicantInformationService?wsdl"; 
2

能否请您发表您的createSOAPRequest方法的代码?我想您对请求没有任何证书问题,因为您从服务器接收到有效的SOAP响应,看起来您的安全性头文件有问题,请检查您的请求SOAP消息是否为Timestamp元素,也许您发送的是创建的或到期标签和服务器拒绝您的请求。