Comment générer DigestValue et SignatureValue pour enveloppés XML Signature à l'aide de PHP/linux outil

j'ai essayé de trouver quelques exemples sur la façon de générer DigestValue et SignatureValue pour XML signature (WSDL).

Ci-dessous est un échantillon de SAVON pour l'application:

<?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> 

J'ai un seul exemple à partir du fournisseur de l'application et je ne peux pas semblent produire les mêmes DigestValue et SignatureValue que celle de l'échantillon. Selon la documentation de l'application, j'ai besoin de créer le digestValue de l'ensemble de la section de Corps.

Je sais que je dois cannonicalize, sha1, puis base64encode. Mais comment puis-je cannonicalize la section de corps? (sha1 et base64 encode est assez facile à comprendre).

D'abord je veux essayer de créer une chaîne de caractères var:

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

mais ensuite, j'ai trouvé qu'il n'y a pas une telle chose comme c14n fonction en PHP (au moins pas pour la chaîne var, et PHP 5.2 et au-dessous; pas un souci, j'ai 5.2.6).

J'ai pris à regarder xmlseclibs.php code et il semble qu'il utilise DOMelement objet pour obtenir C14N fonction. Je ne suis pas très familier sur ce DOMelement est..

J'ai essayé d'utiliser xmlseclibs.php signer mon XML, mais il ne semble pas fonctionner, j'ai eu la "signature non valide" erreur de l'application.

Quelqu'un peut-il aider à éclairer le néophyte (lit, moi 🙂 ) ?

Merci beaucoup pour votre coopération.

OriginalL'auteur mohdyusuf | 2010-01-27