我有一个在 Spring-ws 中实现的 Web 服务客户端,使用 Wss4jSecurityInterceptor 进行 ws-security。
调用端点有效,数据被加密、签名和发送,但是当收到回复时,它没有被解密。而是调用 JAXB 的解组器,导致如下错误:
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>
知道出了什么问题吗?
谢谢。
编辑:这是由在 handleResponse 上返回 false 的 ClientInterceptor 引起的,并且位于 wss4j 拦截器之前,导致所有拦截器处理停止。