Как реализовать клиент веб-службы с подписанным телом и отметкой времени для Weblogic

Я пытаюсь реализовать простой клиент веб-службы для веб-службы с включенным WSS (подписанное тело и отметка времени). Это политика WSS:

<wsp:Policy wsu:Id="SignatureRequired"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:AsymmetricBinding>
                <wsp:Policy>
                    <sp:InitiatorToken>
                        <wsp:Policy>
                            <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                                <wsp:Policy>
                                    <sp:WssX509V3Token10 />
                                </wsp:Policy>
                            </sp:X509Token>
                        </wsp:Policy>
                    </sp:InitiatorToken>
                    <sp:RecipientToken>
                        <wsp:Policy>
                            <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToInitiator">
                                <wsp:Policy>
                                    <sp:WssX509V3Token10 />
                                </wsp:Policy>
                            </sp:X509Token>
                        </wsp:Policy>
                    </sp:RecipientToken>
                    <sp:AlgorithmSuite>
                        <wsp:Policy>
                            <sp:TripleDesRsa15/>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Strict />
                        </wsp:Policy>
                    </sp:Layout>
                    <sp:IncludeTimestamp />
                </wsp:Policy>
            </sp:AsymmetricBinding>
            <sp:SignedParts>
                <sp:Body />
            </sp:SignedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

Реализация клиента основана на примере из документации Oracle: http://docs.oracle.com/cd/E24329_01/web.1211/e24488/message.htm#WSSOV273, а веб-служба работает на Weblogic 12c (12.1.2) и Oracle Java 1.7.0_25.

package com.example.testclient.mtom;

import weblogic.jws.jaxws.ClientPolicyFeature;
import weblogic.jws.jaxws.policy.InputStreamPolicySource;
import weblogic.security.SSL.TrustManager; 
import weblogic.xml.crypto.wss.api.Timestamp;
import weblogic.xml.crypto.wss.api.WSSecurityFactory;
import weblogic.xml.crypto.wss.provider.CredentialProvider; 
import weblogic.xml.crypto.wss.WSSecurityContext; 
import weblogic.wsee.security.bst.ClientBSTCredentialProvider; 

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.soap.MTOMFeature;

import org.apache.commons.lang.RandomStringUtils;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.cert.X509Certificate;

import com.example.attachment.TestWebServiceAttachment_Service;
import com.example.attachment.TestWebServiceAttachment;

public class TestWebServiceAttachmentClient {

    public TestWebServiceAttachmentClient() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) throws Throwable {
        String username = "User"; 
        String password = "Pass"; 
        String clientCertFile = "src/main/resources/User.jks";
        QName operationName = new QName("http://www.example.com/ws/attachment", "fileUpload");

        MTOMFeature mtomFeature = new MTOMFeature();

        InputStream is = new FileInputStream("src/main/resources/my-wssp1.1-signature-required.xml");


        ClientPolicyFeature clientPolicyFeature = new ClientPolicyFeature();
        clientPolicyFeature.setEffectivePolicyForOperation(operationName, new InputStreamPolicySource(is));

        TestWebServiceAttachment_Service service = new TestWebServiceAttachment_Service();
        TestWebServiceAttachment port = service.getTestWebServiceAttachmentPort(clientPolicyFeature, mtomFeature);
        //create credential provider and set it to the Stub
        List credProviders = new ArrayList(); 
        //client side BinarySecurityToken credential provider -- x509
        CredentialProvider cp = new ClientBSTCredentialProvider(clientCertFile, password, username, password);
        credProviders.add(cp);

        Date date = new Date();
        Calendar created = Calendar.getInstance();
        created.setTime(date);
        Calendar expired = Calendar.getInstance();
        expired.setTime(date);
        expired.set(Calendar.HOUR_OF_DAY, created.get(Calendar.HOUR_OF_DAY) + 1);
        Timestamp timestamp = WSSecurityFactory.newTimestamp("TS-" + RandomStringUtils.randomNumeric(34), created, expired);

        Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext();
        requestContext.put(WSSConstants.TIMESTAMP_ELEMENT, timestamp);
        requestContext.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credProviders);
        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://myserver:7001/ws/TestWebServiceAttachment/1.0");
        requestContext.put(WSSecurityContext.TRUST_MANAGER, new TrustManager() {
            public boolean certificateCallback(X509Certificate[] chain, int validateErr) {
             // need to validate if the server cert can be trusted
             return true;
           }
        });


        DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/file1.pdf"));
        long response = port.fileUpload("file1.pdf", dh);
        System.out.println("response = " + response);
      }
}

Проблема в отметке времени. Я не знаю, как правильно добавить временную метку в контекст WSS. Кто-нибудь знает, как реализовать такой клиент? Я получаю следующее исключение:

Exception in thread "main" com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: Timestamp validation failed. Please see the server log to find more detail regarding exact cause of the failure.
at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:125)
at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253)
at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:181)
at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:258)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:117)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:91)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:154)
at com.sun.proxy.$Proxy37.fileUpload(Unknown Source)

person Marek    schedule 02.09.2015    source источник
comment
Вы уверены, что используете правильную временную метку? Где определяется WSSConstants? WSSecurityFactory.newTimestamp, вероятно, не возвращает то, что вы хотите docs.oracle.com/cd/E24329_01/apirefs.1211/e24391/weblogic/xml/   -  person Display Name is missing    schedule 08.09.2015


Ответы (1)


Я знаю, что мой ответ, вероятно, больше не полезен для вас, но может помочь другим. Проверка Weblogic Timestamp предполагает, что соответствующие поля находятся в часовом поясе UTC. Проверьте, находятся ли ваши поля даты и времени в UTC. И сообщение Timestamp validation failed отображается сервером, когда нет поля метки времени или поля метки времени неверны. Вы можете увидеть свой необработанный запрос SOAP, добавив в свой код следующие строки:

System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump". "true");
person AliReza19330    schedule 14.05.2016