我正在用 Java 开发一个 SOAP Web 服务器,其中我的响应必须带有时间戳和签名。要签名的节点是 BODY 和 TIMESTAMP。
问题在于,XmlSignature.sign方法对这些节点进行解组,将命名空间属性放置在 BODY 和 TIMESTAMP 标记中的 Id 属性之前,而由 JAX-WS 解组的出站响应字符串将命名空间属性放置在Id之后。
因此,这些节点计算出的摘要值对记录器无效,即:
Actual Digest: ljf4iIFTgpHUDKtLjYJEto9Ro5k=
Expected Digest: iIYWShXDG4o8f/9L08d+apVsGx0=
我认为如果我可以指定解组器的属性顺序(在签名或响应消息中),我也可以使顺序匹配,但我还没有做到这一点。
我测试了 SOAPHandler 来拦截响应,但我发现无法更改消息属性顺序。
这是由签名类生成的节点时间戳的 XML 代码:
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TS-1000">
<wsu:Created>2019-09-19T10:00:00.000Z</wsu:Created>
<wsu:Expires>2019-09-19T10:05:00.000Z</wsu:Expires>
</wsu:Timestamp>
这是响应中发送的 TIMESTAMP 节点的 XML 代码:
<wsu:Timestamp wsu:Id="TS-1000" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2019-09-19T10:00:00.000Z</wsu:Created>
<wsu:Expires>2019-09-19T10:05:00.000Z</wsu:Expires>
</wsu:Timestamp>
BODY 节点也是如此。签名:
<S:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Body-1000">
<AsignacionNotarioResponse xmlns="http://ancert.notariado.org/XML">
<CodigoRespuesta>0</CodigoRespuesta>
<IdNotificacionCGN>371003</IdNotificacionCGN>
</AsignacionNotarioResponse>
</S:Body>
发送:
<S:Body wsu:Id="Body-1000" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<AsignacionNotarioResponse xmlns="http://ancert.notariado.org/XML">
<CodigoRespuesta>0</CodigoRespuesta>
<IdNotificacionCGN>371003</IdNotificacionCGN>
</AsignacionNotarioResponse>
</S:Body>
胡说叔叔
相关分类