PHP / linux aracını kullanarak zarflı XML İmza için DigestValue ve SignatureValue oluşturmak için nasıl

2 Cevap php

i XML imzası (WSDL) için DigestValue ve SignatureValue oluşturmak için nasıl bazı örnekler bulmaya çalışıyorlar.

Aşağıdaki uygulama için örnek bir sabun:

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

Ben uygulama sağlayıcısına tek bir örnek var ve ben numune olarak aynı DigestValue ve SignatureValue üretmek gibi olamaz. Uygulama belgelerine göre, ben bütün Vücut bölümünden digestValue oluşturmanız gerekir.

Ben base64encode sonra, SHA1 cannonicalize zorunda olduğunu biliyoruz. Ama nasıl ben gövde bölümü cannonicalize mı? (Sha1 ve base64 kodlamak anlamak için yeterince kolaydır).

Başlangıçta ben bir dize VAR oluşturmak denemek istiyorum:

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

ama sonra ben böyle c14n PHP fonksiyon gibi bir şey olduğunu öğrendim (aşağıda en azından var gibi dize için, ve PHP 5.2 ve, bir endişe i 5.2.6 var).

Ben xmlseclibs.php koduna bakmak da aldı ve C14N işlevi almak için DomElement nesneyi kullanmak gibi görünüyor. Ben DomElement ne çok aşina değilim ..

I uygulamadan 'imza geçerli değil' hata var, benim XML imzalamak xmlseclibs.php kullanarak denedim, ama çalışmak için görünmüyor.

Birisi acemi aydınlatmak yardımcı olabilir (bana :), okur?)

İşbirliğiniz için çok teşekkür ederim.

2 Cevap

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

Bu sizin hile yapmak gerekir.

Ben ... Ben fakir belgelerini aldıktan sonra, XML-DSIG ile de meşgul değilim, ve meşrulaştırılmaz ne adet merak: (

Hmm .. Ben aslında bir süre önce çalışma almak için yönetmek.

Rob Richards tarafından xmlseclibs kullanarak sona erdi. http://code.google.com/p/xmlseclibs/

Bunu kütüphane denemenizi öneririz, kullanımı son derece kolaydır.