【问题标题】:Sign SOAP message with WS-Security使用 WS-Security 签署 SOAP 消息
【发布时间】:2024-01-21 01:00:01
【问题描述】:

我需要使用一个 SOAP API,它请求所有消息都被签署策略“SigOnly”。

我已经使用 wsimport 从 WSDL 生成了客户端代码,我希望它也会生成用于签名的代码,但事实并非如此。

MyWebservice service = new MyWebservice();
MyWebservicePortType port = service.getMyWebserviceSOAPportHttp();

// Build request
ObjectFactory objectFactory = new ObjectFactory();
MyRequest request = objectFactory.createMyRequest();

// Call endpoint

port.myRemoteMethod(request);

wsimport 工具是否有额外的开关来生成用于签名的代码,还是我在客户端代码中遗漏了一些步骤?

【问题讨论】:

    标签: java soap ws-security wsimport


    【解决方案1】:

    WS-Security 是soap 的扩展,所以我认为wsimport 无法在代码生成中处理它。 无论如何,您可以编写处理程序以在您的肥皂请求中添加 ws-security 标头。 您可以通过这种方式将处理程序添加到您的端口:

    BindingProvider bp = (BindingProvider) port;
    List<Handler> handlerChain = new ArrayList<Handler>();
    handlerChain.add( new MyHandler() );
    Binding binding = bp.getBinding();
    binding.setHandlerChain(handlerChain);
    

    MyHandler 类必须实现 SOAPHandler。 这是MyHandler的handleMessage方法的一个实现示例,添加了一个header

    @Override
    public boolean handleMessage(SOAPMessageContext smc) {
        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    
        if (outboundProperty.booleanValue()) {
    
            SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
            SOAPHeader header = envelope.addHeader();
            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("MyUser");
    
        }
    }
    

    【讨论】: