Java 使用不同时区的UsernameToken时间戳进行WS-Secured标头验证(WSS4j)时出错
我已经在ApacheCXF(2.7.11)中构建了一个web服务(基于自顶向下),其中包含WSS4J和UsernameToken时间戳功能。当我用soapui测试同样的代码时,服务器和客户机代码似乎工作得很好 但是在WS-Security报头中有一个客户端代码,它在IST(印度标准时间)时区中发送数据;为此,客户机接收到错误Java 使用不同时区的UsernameToken时间戳进行WS-Secured标头验证(WSS4j)时出错,java,cxf,ws-security,wss4j,Java,Cxf,Ws Security,Wss4j,我已经在ApacheCXF(2.7.11)中构建了一个web服务(基于自顶向下),其中包含WSS4J和UsernameToken时间戳功能。当我用soapui测试同样的代码时,服务器和客户机代码似乎工作得很好 但是在WS-Security报头中有一个客户端代码,它在IST(印度标准时间)时区中发送数据;为此,客户机接收到错误消息已过期(WSSecurityEngine:Invalid timestamp消息的安全语义已过期)正在抛出。我调查发现WSS4J使用的时区是UTC。在WSS4JInter
消息已过期(WSSecurityEngine:Invalid timestamp消息的安全语义已过期)
正在抛出。我调查发现WSS4J使用的时区是UTC。在WSS4JInterceptor中将timestampStrict设置为false也不起作用。任何帮助都将不胜感激
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<property name="properties">
<map>
<entry key="action" value="UsernameToken Timestamp" />
<entry key="timestampStrict" value="false"/>
<entry key="user" value="test_user" />
<entry key="passwordType" value="PasswordText" />
<entry>
<key>
<value>passwordCallbackRef</value>
</key>
<ref bean="passwordCallback" />
</entry>
</map>
</property>
</bean>
</jaxws:inInterceptors>
passwordCallbackRef
根据SOAP消息安全配置文件,在UTC时间以外的任何时间发送时间戳都是无效的:“所有引用必须在UTC时间。”
Colm.嗨,谢谢你的回复。但是,客户机代码是一个遗留代码&他们使用IST时区发送数据,因为他们不使用UTC发送数据。是否有任何其他配置可以在服务器端完成,因为作为遗留代码,他们不想更改客户端代码。您唯一的选择是插入自定义时间戳验证实现。这里是默认的时间戳验证器:-您可以通过“wss4j.validator.map”属性将时间戳验证器添加到WSS4JInInterceptor。