2013-11-26 3 views
5

Ich konsumiere einen Webservice in Java. Dieser Dienst verwendet UserNameToken, Timestamp und Signatur für die Sicherheit auf Nachrichtenebene. Ich habe SoapUI-Projektdatei (XML) erhalten, um zu versuchen, die Daten vom Dienst zu erhalten. Alles funktioniert gut in SoapUI.Mit einem Web-Service in Java und SOAPUI

Jetzt, wenn ich versuche, die gleiche soapUI-Datei zu verwenden, um die Artefakte zu generieren, erhalte ich eine Nachricht "Receiver Policy falsified". Warum kann ich mit dem Dienst in soapUI verbinden, aber ich kann nicht in Java?

So habe ich herausgefunden, dass ich keinen Schlüsselspeicher mit Transport Layer Security senden. Wie sende ich dies in einer SOAP-Anfrage. Ich habe eine ähnliche Einstellung in der SOAP-Benutzeroberfläche in den SSL-Einstellungen vorgenommen und sie funktioniert dort.

Dies ist mein Code für SOAP-Anforderung in 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()); 

Und SSLFactory-Code ist wie diese

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; 
    } 

Und die Fehler SOAP-Antwort i bekommen habe ist, wie diese

<?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> 

Jetzt erhalte ich diese Störung

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

Haben Sie einen Richtliniensatz definiert? –

+0

nein, auch wenn ich die Anfrage verwende, die ich durch Java-Code in Soapui erzeuge, funktioniert das auch, wenn ich "Authentifizierung" anwende. So verstehe ich nicht, wie ich sonst Authentifizierung in meinem Java-Code anwenden werde. – yogsma

+0

Was ist Ihr Anwendungsserver? – user1807337

Antwort

2

Vielleicht haben Sie "wsdl?" Am Ende der URL-String anhängen:

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

Könnten Sie bitte Ihre createSOAPRequest Methode Code schreiben ?, Ich denke, Sie haben keine Zertifikatsprobleme mit der Anfrage, weil Sie eine gültige SOAP-Antwort vom Server erhalten, etwas mit Ihren Sicherheitsheadern nicht stimmt, Ihre SOAP-Nachricht für das Timestamp-Element überprüft, vielleicht einen falschen Wert für created oder Abgelaufene Tags und der Server lehnt Ihre Anfrage ab.