Come generare DigestValue e SignatureValue per avvolgere Firma XML con PHP/linux strumento

ho cercato di trovare alcuni esempi su come generare DigestValue e SignatureValue firma XML (WSDL).

Di seguito è riportato un esempio di SAPONE per l’applicazione:

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

Ho un solo esempio dal fornitore dell’applicazione e I cant sembrano produrre gli stessi DigestValue e SignatureValue come campione. Secondo la documentazione allegata alla domanda, ho la necessità di creare l’digestValue da tutta la sezione del Corpo.

So che devo cannonicalize, sha1, quindi base64encode. Ma come faccio a cannonicalize sezione del corpo? (sha1 e base64 codifica è abbastanza facile da capire).

Inizialmente vorrei provare a creare una stringa var:

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

ma poi ho scoperto che non c’è nessuna tale cosa come c14n funzione in PHP (almeno non per la stringa var e PHP 5.2 e sotto; non ti preoccupare, ho 5.2.6).

Ho preso a guardare xmlseclibs.php codice e sembra di usare DOMelement oggetto per ottenere C14N funzione. Io non sono molto familiare su ciò che DOMelement è..

Ho provato ad utilizzare xmlseclibs.php a firmare il mio XML, ma non sembra funzionare, ho avuto la “firma non valida’ errore di applicazione.

Qualcuno può illuminare il newbie (legge, di me 🙂 ) ?

Ringrazio molto per la collaborazione.

InformationsquelleAutor mohdyusuf | 2010-01-27

 

2 Replies
  1. 2
    <?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)));  
    ?>  

    Che dovrebbe fare il trucco.

    Anche io sono impegnato con XML-DSIG, e vi chiedete a cosa pezzi di canonizza, da quando ho ricevuto la scarsa documentazione… 🙁

Lascia un commento