肥皂标准化变换

我正在尝试使用Datapower设备上托pipe的soap服务。 到目前为止,发送soap服务和接收方为下面的xml计算摘要是不同的。

应用于创build摘要值的转换

<ds:Reference URI="#TS-f3c103e9-1897-43d8-8cf6-274bdb647678"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse soap"/> </ds:Transform> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <ds:DigestValue>1rjXQQWVMM5KBWY8uswUynk6PCk=</ds:DigestValue> </ds:Reference> 

引用的元素。

 <wsu:Timestamp wsu:Id="TS-f3c103e9-1897-43d8-8cf6-274bdb647678"> <wsu:Created>2016-02-24T15:32:12.693Z</wsu:Created> <wsu:Expires>2016-02-24T15:37:12.693Z</wsu:Expires> </wsu:Timestamp> 

上述元素的名称空间应用于根节点上

  • 的xmlns:WSU = “http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd”
  • 的xmlns:DS = “http://www.w3.org/2000/09/xmldsig#”

发送上述XML可以正常工作(从Java SOAP客户端库创build)。 但是,当我用节点sha1消化同样的元素时,我得到了不同的摘要值。

我正在尝试在计算摘要值之前发现java在转换中的作用。 如果我能找出它实际发送到sha1方法的内容,我可以修改节点中的代码来做同样的事情。

给定上面的引用元素,sha1之前的变换之前的输出xml是什么?

您需要弄清楚您的Java库或API如何创build向SHA1方法发送的规范化XML。

使用Apache Commons Codec( https://commons.apache.org/proper/commons-codec/ )并猜测Timestamp元素中的C14N'd XML以及Transform元素中包含的命名空间,我可以得到相同的摘要值:1rjXQQWVMM5KBWY8uswUynk6PCk =

以下是我使用的代码:

 import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; public class Sha1Test { public static void main(String args[]) throws Exception { String data = "<wsu:Timestamp xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" wsu:Id=\"TS-f3c103e9-1897-43d8-8cf6-274bdb647678\"><wsu:Created>2016-02-24T15:32:12.693Z</wsu:Created><wsu:Expires>2016-02-24T15:37:12.693Z</wsu:Expires></wsu:Timestamp>"; printShaDigest(data); } static void printShaDigest(String data) { System.out.println("data = " + data); System.out.println("sha1 = " + new String(Base64.encodeBase64(DigestUtils.sha1(data.getBytes())))); } }