2017-07-27 60 views
0

我尝试连接(没有成功)以下WS使用Java:与TERYT集成 - 波兰政府网络服务

我想我们e soapui没有成功。试过基本和NTLM身份验证,而我总是得到以下错误:下面的例子此Web服务节目

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/soap/fault</a:Action> 
    </s:Header> 
    <s:Body> 
     <s:Fault> 
     <faultcode xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">a:InvalidSecurity</faultcode> 
     <faultstring xml:lang="en-US">An error occurred when verifying security for the message.</faultstring> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

的官方说明使用C#进行连接。我没有测试过这个,但我认为它能正常工作。

try { 
    var proxy = new ChannelFactory<ServiceReferenceWCF.ITerytWs1>("custom"); 
    proxy.Credentials.UserName.UserName = login; 
    proxy.Credentials.UserName.Password = haslo; 
    var result = proxy.CreateChannel(); 
    var test = result.CzyZalogowany(); // should return true if connected correctly 
} catch (Exception ex) { } 

及以下设置:

<client> 
     <endpoint address="https://uslugaterytws1.stat.gov.pl/TerytWs1.svc" binding="customBinding" bindingConfiguration="custom" contract="ServiceReference1.ITerytWs1" name="custom" /> 
    </client> 
    <bindings> 
     <customBinding> 
     <binding name="custom"> 
      <security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport" requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"> 
       <localClientSettings detectReplays="false" /> 
       <localServiceSettings detectReplays="false" /> 
      </security> 
      <textMessageEncoding messageVersion="Soap11WSAddressing10" /> 
      <httpsTransport maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" /> 
     </binding> 
     </customBinding> 
    </bindings> 

所以,我试图用Java以下方式连接:

public static void main(String[] args) { 
    try { 
     final String wsdlResourcePath = "wsdl/jaxb/teryt/terytws1.wsdl"; 
     final String url = "https://uslugaterytws1test.stat.gov.pl/TerytWs1.svc"; 
     ITerytWs1 teryt = createSoapEndpoint((wsdlLocation) -> new TerytWs1(wsdlLocation).getCustom(), wsdlResourcePath, url); 
     System.out.println(teryt.czyZalogowany()); 
    } catch (Exception e) { } 
} 

private static <SOAP> SOAP createSoapEndpoint(SoapCreator<SOAP> soapCreator, String wsdlResourcePath, String url) { 
    ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
    URL wsdlLocation = cl.getResource(wsdlResourcePath); 
    SOAP soap = soapCreator.create(wsdlLocation); 

    BindingProvider provider = (BindingProvider) soap; 

    Map<String, Object> context = provider.getRequestContext(); 
    context.put(BindingProvider.USERNAME_PROPERTY, "TestPubliczny"); 
    context.put(BindingProvider.PASSWORD_PROPERTY, "1234abcd"); 
    context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); 
    return soap; 
} 

不幸的是,代码调用过程中 “teryt.czyZalogowany()” 冻结。不给予超时 - 任何事情,只是永远处理这条线,或者被阻止。

我的Java代码会产生以下警告消息:

WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }SignedSupportingTokens" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }TransportBinding" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }Trust10" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }Wss11" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://www.w3.org/2006/05/addressing/wsdl }UsingAddressing" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN".

也许有人知道更多关于这类问题,或将能够用他自己的配置马上连接到这个WS - 此刻我不没有一个线索可能是什么问题,我看到在我面前有一个“浪费时间”的观点......所以请帮助。

回答

2

请启用寻址功能:

TerytWs1 teryt = new TerytWs1(); 
//teryt.setHandlerResolver(new HeaderHandlerResolver()); 
WebServiceFeature wsAddressing = new AddressingFeature(true); 
ITerytWs1 client = teryt.getCustom(wsAddressing); 
+0

谢谢bartosz。现在 - 在打开地址的情况下 - Java响应与soapui一致:“验证消息的安全性时发生错误。”看起来有更多的配置丢失。您是否能够连接并接收来自此Web服务的成功响应? – msi

0

我设法做连接使用JAX-WS来TERYT。

首先,您需要使用wsimport为客户端生成类。在生成的类中将有ITerytWs1和TerytWs1 - 这是目前您唯一感兴趣的。 然后,您可以添加SOAPHandler类来处理的头,像这样:

public class TerytHeaderHandler implements SOAPHandler<SOAPMessageContext> 
{ 
    private String wsUser; 
    private String wsPassword; 

    public TerytHeaderHandler(String wsUser, String wsPassord) 
    { 
     this.wsUser = wsUser; 
     this.wsPassword = wsPassord; 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext smc) 
    { 
     Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outboundProperty.booleanValue()) 
     { 
      try 
      { 
       SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); 
       SOAPHeader header = envelope.getHeader(); 
       SOAPElement security = header.addChildElement("Security", "wsse", 
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
       SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse"); 
       SOAPElement username = usernameToken.addChildElement("Username", "wsse"); 
       username.addTextNode(wsUser); 
       SOAPElement password = usernameToken.addChildElement("Password", "wsse"); 
       password.setAttribute("Type", 
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
       password.addTextNode(wsPassword); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } else 
     { 
      //This handler does nothing with the response from the Web Service 
      //even though it should probably check its mustUnderstand headers 
      SOAPMessage message = smc.getMessage(); 
     } 
     return outboundProperty; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void close(MessageContext context) 
    { 
     // TODO Auto-generated method stub 
    } 

    // Gets the header blocks that can be processed by this Handler instance. 
    @Override 
    public Set<QName> getHeaders() 
    { 
     QName securityHeader = new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", 
       "Security"); 
     HashSet<QName> headers = new HashSet<QName>(); 
     headers.add(securityHeader);   
     return headers; 
    } 
} 

然后你使用它是这样的:

public class Main { 
public static void main(String[] args) { 
    ITerytWs1 instance = new TerytWs1().getCustom(new AddressingFeature(true)); 
    Binding binding = ((BindingProvider) instance).getBinding(); 
    List<Handler> handlerList = binding.getHandlerChain(); 
    if (handlerList == null) 
     handlerList = new ArrayList<Handler>(); 
    handlerList.add(new TerytHeaderHandler("TestPubliczny", "1234abcd")); 
    binding.setHandlerChain(handlerList); 
    System.out.println(instance.czyZalogowany()); 
} 
} 

就我而言,我曾与getHeaders问题( )功能。管理处理它感谢这里的一些其他问题在StackOverflow的建议。