Hello
Sorry in advance if this is addressed to the wrong list - it's Axis2 related,
but could be a WSS4J or Rampart issue.
We have a web service developed with Axis2 v1.5, using Rampart v1.4 for
WS-Security. The service is configured such that each request requires a
WS-Security Header that contains a UsernameToken and Timestamp.
So, an example request looks like this (uninteresting bits replaced with ...
for brevity):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
... >
<soapenv:Header>
<wsse:Security xmlns:wsse="..." xmlns:wsu="..."
soapenv:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-31497800">
<wsu:Created>2009-11-02T14:00:00Z</wsu:Created>
<wsu:Expires>2009-11-02T15:00:00Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken wsu:Id="UsernameToken-10697954">
<wsse:Username>...</wsse:Username>
<wsse:Password Type="...#PasswordText">...</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>.... </soapenv:Body>
</soapenv:Envelope>
Up until recently, this worked without a hitch. However, it stopped working
last weekend when the clocks went back (I'm in London, the local time used to
be GMT +1h, i.e. UTC+01:00, it's now UTC).
So, whilst we were in British Summer Time (i.e. UTC +1h), everything was OK.
If the current time was 14:30, I could send a request such as that above with
Created=14:00 and Expires=15:00 and it would work.
However, since the clocks have changed (BST is now over and the local time is
UTC+0h), it doesn't work anymore. Now, if the current time is 14:30 and I send
the request with Created=14:00 and Expired=15:00, I get an error in Tomcat's
STDOUT:
[ERROR] WSDoAllReceiver: The timestamp could not be validated
org.apache.axis2.AxisFault: WSDoAllReceiver: The timestamp could not be
validated
at
org.apache.rampart.handler.WSDoAllReceiver.processBasic(WSDoAllReceiver.java:334)
at
org.apache.rampart.handler.WSDoAllReceiver.processMessage(WSDoAllReceiver.java:86)
at org.apache.rampart.handler.WSDoAllHandler.invoke(WSDoAllHandler.java:72)
at org.apache.axis2.engine.Phase.invoke(Phase.java:318)
at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:251)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:160)
at
org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:167)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142)
...
Instead, I have to add an hour to each of the timestamps (even though they're
specified as Z, i.e. UTC). So, if the current time is 14:30 and I send the
request with Created=15:00 and Expired=16:00, it works.
I got concerned about timezones on different machines, clock sync, etc., so in
the end I decided to run everything locally. I've restarted the machine since
the clocks changed, Java agrees that that local timezone is GMT+00:00 and yet
with the client and the server both on the same machine, I still get the error
unless I force the timestamps to an hour in the future.
Note that I do not have a problem with a smaller window. I.e. If the current
time is 14:30 and I send the request with Created=14:29 and Expired=14:34 (i.e.
a five-minute instead of one-hour timespan), it works.
Any ideas on what's causing this?
Thanks very much
Darren Clarke
________________________________
The information contained in this message is confidential and is intended for
the addressee only. Any unauthorised dissemination or copying or use or
disclosure of information contained herein is strictly prohibited and may be
illegal. If you are not the named or intended recipient please notify us
immediately by telephone (+44 207 154 2070) or return e-mail. We have installed
active virus software but do not accept liability or responsibility for the
security or reliability of transmission or for any virus transmitted; as such
you should carry out your own virus checks before opening any attachment.
Mfuse Limited registered in England and Wales, company number 04468412.
Registered Office: 3rd Floor, Mitre House, 177 Regent Street, London W1B 4JN