首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用PHP/linux工具生成封装XML签名的DigestValue和SignatureValue

如何利用PHP/linux工具生成封装XML签名的DigestValue和SignatureValue
EN

Stack Overflow用户
提问于 2010-01-28 00:40:36
回答 2查看 12K关注 0票数 3

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

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

代码语言:javascript
复制
<?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。根据应用程序文档,我需要从整个正文部分创建digestValue。

我知道我必须先加农炮,sha1,然后是base64encode。但是我该如何炮制身体部分呢?(sha1和base64 encode很容易理解)。

最初,我想尝试创建一个字符串var:

代码语言:javascript
复制
$whole_body = '<soapenv:Body Id="Body"> ........stuff inside...... </soapenv:Body>';

但是后来我发现PHP中没有c14n函数(至少不适用于像var和PHP5.2及更低版本这样的字符串;不用担心,我有5.2.6)。

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

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

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

非常感谢您给予我们的合作。

EN

回答 2

Stack Overflow用户

发布于 2010-07-15 18:06:19

代码语言:javascript
复制
<?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,想知道该规范化哪些部分,因为我收到的文档很差……:(

票数 3
EN

Stack Overflow用户

发布于 2010-07-17 11:01:35

嗯..。实际上,我在一段时间前成功地让它工作了。

我最终使用了Rob Richards的xmlseclibs。http://code.google.com/p/xmlseclibs/

我建议你试试那个库,它非常容易使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2148637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档