[
https://issues.apache.org/jira/browse/WSS-197?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dave Ortman updated WSS-197:
----------------------------
Attachment: book-wss.zip
Within this sample, there is a client process which is performing two actions
on outgoing messages : an x509 signature and a UsernameToken. This is being
driven by the following Spring interceptors:
<bean id="securityInterceptor"
class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
<property name="securementActions" value="Signature" />
<property name="securementUsername" value="dortman" />
<property name="securementPassword" value="password" />
<property name="securementSignatureCrypto">
<bean
class="org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean">
<property name="keyStorePassword"
value="password" />
<property name="keyStoreLocation"
value="classpath:dortman.jks" />
</bean>
</property>
<property name="securementSignatureKeyIdentifier"
value="DirectReference" />
</bean>
<bean id="wss4jWithCorrectUsernameAndPassword"
class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
<property name="securementActions" value="UsernameToken" />
<property name="securementUsername" value="Ernie" />
<property name="securementPassword" value="Bert" />
</bean>
On the server, the following configuration is verifying these same actions:
<bean id="wsDigCerSecurityInterceptor"
class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
<property name="validationActions" value="Signature
UsernameToken" />
<property name="validationSignatureCrypto">
<bean
class="org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean">
<property name="keyStorePassword"
value="password" />
<property name="keyStoreLocation"
value="classpath:dortman.jks" />
</bean>
</property>
<property name="validationCallbackHandler">
<bean
class="org.springframework.ws.soap.security.wss4j.callback.SimplePasswordValidationCallbackHandler">
<property name="users">
<props>
<prop key="Ernie">Bert</prop>
</props>
</property>
</bean>
</property>
</bean>
This works fine. The problem comes when I alter the order of the actions to:
<property name="validationActions" value="UsernameToken Signature" />
This leads to the following error, issued from Spring:
Exception in thread "main"
org.springframework.ws.soap.client.SoapFaultClientException: Security
processing failed (actions mismatch)
at
org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:37)
at
org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:738)
at
org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:564)
Spring is relying on the WSHandler class; here is the order of operations
(Spring WS 1.5.7 and WSS4J 1.5.7):
Wss4jHandler(WSHandler).checkReceiverResults(Vector, Vector) line: 280
Wss4jHandler.checkReceiverResults(Vector, Vector) line: 64
Wss4jSecurityInterceptor.validateMessage(SoapMessage, MessageContext)
line: 508
Wss4jSecurityInterceptor(AbstractWsSecurityInterceptor).handleRequest(MessageContext,
Object) line: 101
SoapMessageDispatcher(MessageDispatcher).dispatch(MessageContext) line:
213
SoapMessageDispatcher(MessageDispatcher).receive(MessageContext) line:
168
Spring is passing in two vectors (results and actions), but the order of them
do not match. If I manually reorder them, the validation succeeds.
This problem was noticed when an external process was calling a service, and
was appending a UsernameToken element at the end of the security header.
I see that the latest version of the method takes two lists instead of two
vectors; but the logic appears the same. Again, I am under the assumption that
order should not be relevant in this method, but I am not entirely sure that is
the case.
Thanks.
> Order of security actions may result in validation failing
> ----------------------------------------------------------
>
> Key: WSS-197
> URL: https://issues.apache.org/jira/browse/WSS-197
> Project: WSS4J
> Issue Type: Bug
> Components: WSS4J Handlers
> Affects Versions: 1.5.7
> Environment: Tomcat (5.5, 6.0), Spring WS Security 1.5.7
> Reporter: Dave Ortman
> Assignee: Ruchith Udayanga Fernando
> Attachments: book-wss.zip
>
>
> I have found that the order of security actions is particularly relevant when
> they are processed. That is, the XSD which defines the security header seems
> to imply no necessary order. However, swapping the order of two elements (in
> this case, UsernameToken and Signature) will result in the a failure.
> I have attached a sample application with a working service and a client that
> calls that service. It works as expected. It is using Spring Web Security
> 1.5.7. It is setup to use both a Signature and a UsernameToken.
> The problem occurred when a client was calling a service and sending a
> message in which the UsernameToken element was put *after* the
> BinarySecurityToken element. I tracked the problem down to the
> org.apache.ws.security.handler.WSHandler.checkReceiverResults(Vector
> wsResult, Vector actions) method. This class is being extended by Spring in
> the Wss4jHandler class - but the checkReceiverResults simply calls
> super.checkReceiverResults().
> This method assumes that the actions and the results are in the same order.
> However, by altering the order of these elements (either on the client or on
> the server), this assumption becomes incorrect. What I am not clear on is
> whether the issue is with the underlying Apache class, or with the Spring
> class. When checkReceiverResults() is called, should the results and the
> actions be in the same order?
> protected boolean checkReceiverResults(Vector wsResult, Vector actions) {
> int resultActions = wsResult.size();
> int size = actions.size();
> int ai = 0;
> for (int i = 0; i < resultActions; i++) {
> final Integer actInt = (Integer) ((WSSecurityEngineResult)
> wsResult
> .get(i)).get(WSSecurityEngineResult.TAG_ACTION);
> int act = actInt.intValue();
> if (act == WSConstants.SC || act == WSConstants.BST) {
> continue;
> }
> if (ai >= size || ((Integer) actions.get(ai++)).intValue() !=
> act) {
> return false;
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]