我得到了由SoapUI生成的正确签名的XML文件。下面的代码是 WSSE 标头的一部分。
<ds:Reference URI="#id-AF3B7DA5121961AAD81538052175642352">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="k20 k201 v20 v201 v202 w" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>1rHcIC43O2CYNQesaNK/uQpnJ8M=</ds:DigestValue>
</ds:Reference>
正如我们所看到的,DigestValue 等于1rHcIC43O2CYNQesaNK/uQpnJ8M= 但经过我的计算等于sc6nLxoiPHloI1X/ufbMEMFEd6c=
我的规范化 Body 元素 (c14n( 如下所示:
<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-AF3B7DA5121961AAD81538052175642352"><v20:WyszukanieReceptWystawiajacegoRequest><kryteriaWyszukiwaniaRecept></kryteriaWyszukiwaniaRecept></v20:WyszukanieReceptWystawiajacegoRequest></soapenv:Body>
我正在用PHP写作。为了计算我正在使用的摘要值:
$canonicalizedXml = $doc->C14N(true, false, null, ['k20', 'k201', 'v20', 'v201', 'v202', 'w']);
$hash = sha1($canonicalizedXml, true);
$digestValue = base64_encode($hash);
请告诉我我做错了什么。
问题已解决 - 要使用 C14N,我们需要加载整个文档,然后加载 body 元素。C14N 将从根标记向正文添加一些属性。
$bodyNode = $doc->getElementsByTagName('Body')->item(0);
$canonicalizedXml = $bodyNode->C14N(true, false, null, ['k20', 'k201', 'v20', 'v201', 'v202', 'w']);
$hash = sha1($canonicalizedXml, true);
$digestValue = base64_encode($hash);