Java 使用不同时区的UsernameToken时间戳进行WS-Secured标头验证(WSS4j)时出错

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

我已经在ApacheCXF(2.7.11)中构建了一个web服务(基于自顶向下),其中包含WSS4J和UsernameToken时间戳功能。当我用soapui测试同样的代码时,服务器和客户机代码似乎工作得很好

但是在WS-Security报头中有一个客户端代码,它在IST(印度标准时间)时区中发送数据;为此,客户机接收到错误
消息已过期(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。