Wss4jSecurityInterceptor没有解密回复

时间:2013-05-23 18:41:05

标签: spring jaxb spring-ws wss4j

我有一个在Spring-ws中实现的Web服务客户端,使用wss4jSecurityInterceptor来实现ws-security。

呼叫端点工作,数据被加密,签名和发送,但是当收到回复时,它不会被解密。而是调用JAXB的unmarshaller,导致如下错误:

Error : org.springframework.oxm.jaxb.JaxbUnmarshallingFailureException:
JAXB unmarshalling exception: unexpected element 
(uri:"http://www.w3.org/2001/04/xmlenc#", local:"EncryptedData"). 
Expected elements are...

然后,预期元素会列出xdd中的每种数据类型。

这是我的Wss4jSecurityIntercepter配置的:

         

<!-- username / password for signing -->
<property name="enableSignatureConfirmation" value="false" />
<property name="securementUsername" value="${securementUsername}" />
<property name="securementSignatureKeyIdentifier" value="DirectReference" />
<property name="securementPassword" value="${keystore.password}" />
<property name="securementSignatureCrypto" ref="crypto" />

<!-- username (certificate) and keystore for encryption -->
<property name="securementEncryptionUser" value="${securementEncryptionUsername}" />
<property name="securementEncryptionKeyIdentifier" value="SKIKeyIdentifier" />
<property name="securementEncryptionCrypto" ref="crypto" />

<!-- validate incoming message signature and decrypt -->
<property name="validationActions" value="Signature Encrypt Timestamp" />
<property name="validationDecryptionCrypto" ref="crypto" />
<property name="validationSignatureCrypto" ref="crypto" />

<property name="validationCallbackHandler">
    <bean
        class="org.springframework.ws.soap.security.wss4j.callback.KeyStoreCallbackHandler">
        <property name="privateKeyPassword" value="${keystore.password}" />
    </bean>
</property>

知道出了什么问题吗?

感谢。

编辑:这是由一个ClientInterceptor导致的,它在handleResponse上返回false,位于wss4j拦截器之前,导致所有拦截器处理停止。

2 个答案:

答案 0 :(得分:0)

您的根本原因可能与另一方保护邮件的顺序有关:

  

行动的顺序很重要,并由行政部门强制执行   拦截器。拦截器将拒绝传入的SOAP消息   其安全措施的执行顺序与执行顺序不同   由validationActions指定。

我建议您提高日志级别(如果您尚未使用它,请添加log4j以查看拦截器无法解密消息的原因。

最后但并非最不重要的一点是,如果消息未被解密,您应该实现验证器以防止您的进程更进一步。

答案 1 :(得分:0)

由于拦截器配置错误造成的。 (参见原始问题中的编辑)