使用java和SOAPUI中的web服务

使用java和SOAPUI中的web服务,java,web-services,soapui,Java,Web Services,Soapui,我正在使用java中的Web服务。此服务使用UserNameToken、时间戳和签名实现消息级安全性。我已经获得了SoapUI项目文件(xml)来尝试从服务中获取数据。在SoapUI中一切都很好 现在,当我尝试使用同一个soapUI文件生成工件时,我得到一条消息“Receiver Policy false”。为什么我可以在soapUI中连接到服务,但在java中却不能 所以我发现我没有使用传输层安全性发送密钥库。如何在SOAP请求中发送此消息。我在soapui中的SSL设置中做了类似的设置,它在

我正在使用java中的Web服务。此服务使用UserNameToken、时间戳和签名实现消息级安全性。我已经获得了SoapUI项目文件(xml)来尝试从服务中获取数据。在SoapUI中一切都很好

现在,当我尝试使用同一个soapUI文件生成工件时,我得到一条消息
“Receiver Policy false”
。为什么我可以在soapUI中连接到服务,但在java中却不能

所以我发现我没有使用传输层安全性发送密钥库。如何在SOAP请求中发送此消息。我在soapui中的SSL设置中做了类似的设置,它在那里工作

这是我用java编写的SOAP请求代码

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());
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;
    }
<?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>
我得到的错误SOAP响应是这样的

  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;
    }
<?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>
可能您必须在url字符串的末尾附加“?wsdl”:

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

您可以发布您的createSOAPRequest方法代码吗?我认为您的请求没有任何证书问题,因为您正在从服务器接收有效的SOAP响应,看起来您的安全头有问题,请检查您的请求SOAP消息中的Timestamp元素,可能您为created或expires标记发送了不正确的值,服务器拒绝了您的请求。

您似乎需要设置SSL上下文,以便能够在Java代码中通过HTTPS发送SOAP。为此,您可能需要遵循以下两个示例:


  • 此外,如果您考虑使用一个框架来执行此操作,我建议您使用CXF+Apache CAMEL:< /P>您定义了任何策略集吗?不,如果我使用java代码,在SOAPUI中创建的请求,那么当我应用“身份验证”时,也会起作用。因此,我不明白如何在java代码中应用身份验证。您的应用程序服务器是什么?您是否将SoapUI发送的soap消息与代码发送的消息进行了比较?policyResult由工具插入,请参阅。你在另一边有一个系统管理员可以和你交谈吗?