ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-12-10 10:35:05  阅读:365  来源: 互联网

标签:wsdl sha1 xml-signature php xmlsec


我一直在尝试寻找有关如何为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.根据应用程序文档,我需要从整个正文部分创建digestValue.

我确实知道我必须先规范化sha1,然后再进行base64encode.但是我如何规范化身体部分? (sha1和base64编码很容易理解).

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

$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,想知道应该规范哪些部分,因为我收到的文档很差…

标签:wsdl,sha1,xml-signature,php,xmlsec
来源: https://codeday.me/bug/20191210/2100793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有