gpt4 book ai didi

php - 如何使用 PHP/linux 工具为封装的 XML 签名生成 DigestValue 和 SignatureValue

转载 作者:搜寻专家 更新时间:2023-10-31 20:56:09 25 4
gpt4 key购买 nike

我一直在努力寻找一些关于如何为 XML 签名 (WSDL) 生成 DigestValue 和 SignatureValue 的示例。

下面是应用程序的示例 SOAP:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:SOAP-SEC="http://schemas.xmlsoap.org/soap/security/2000-12" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<SOAP-SEC:Signature soapenv:actor="" soapenv:mustUnderstand="0">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#Body">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue></ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue></ds:SignatureValue>
</ds:Signature>
</SOAP-SEC:Signature>
</soapenv:Header>
<soapenv:Body Id="Body">
<SomeApplicationMethod soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Application href="#id0"/></SomeApplicationMethod>
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:NCDServices" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns1:SomeApplicationMethod">
<param2 xsi:type="soapenc:string">123456</param2>
<param3 xsi:type="soapenc:string">someString</param3>
<param4 xsi:type="soapenc:string">string123 bla bla</param4>
<param5 xsi:type="soapenc:string">0</param5>
</multiRef>
</soapenv:Body>
</soapenv:Envelope>

我有一个来自应用程序提供商的示例,但我似乎无法生成与示例相同的 DigestValue 和 SignatureValue。根据应用程序文档,我需要从整个 Body 部分创建 digestValue。

我知道我必须规范化,sha1,然后是 base64encode。但是我如何规范化正文部分呢? (sha1 和 base64 编码很容易理解)。

最初我想尝试创建一个字符串变量:

$whole_body = '<soapenv:Body Id="Body"> ........stuff inside...... </soapenv:Body>';

但后来我发现在 PHP 中没有 c14n 函数这样的东西(至少对于像 var 这样的字符串,以及 PHP 5.2 及以下版本;不用担心,我有 5.2.6)。

我查看了 xmlseclibs.php 代码,它似乎使用 DOMelement 对象来获取 C14N 函数。我对 DOMelement 是什么不是很熟悉..

我尝试使用 xmlseclibs.php 来签署我的 XML,但它似乎不起作用,我从应用程序中收到“签名无效”错误。

有人可以帮助启发新手(阅读,我:))吗?

非常感谢您的配合。

最佳答案

<?php 

$dom = new DOMDocument();
$dom->loadXML($yourXML); // the XML you specified above.

$canonicalized = $dom->C14N(); // for the whole document

// .. or:
$tag = $dom->getElementById("yourID"); // give it an ID, or use getElementsByTagName with ->item(0) or something
$canonicalized = $tag->C14N();

// $canonicalized is the canonicalized form of the XML
// So, The DigestValue is just:
$digest = base64_encode(pack("H*", sha1($canonicalized)));
?>

这应该可以解决您的问题。

我也忙于 XML-DSIG,想知道哪些部分要规范化,因为我收到的文档很差...:(

关于php - 如何使用 PHP/linux 工具为封装的 XML 签名生成 DigestValue 和 SignatureValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com