2017-11-21 3 views
2

Ich muss ein Dokument mit XDAES-EPES signieren und ich verwende PHP für diesen Zweck.Xml mit XDAES-EPES mit PHP signieren

Mit dem untenstehenden xml konnte ich den Digest-Wert <ds:DigestValue>ql0urtXTsc9W0GMIhTdzYHXnQYfnieoIttOBn9fGw7A=</ds:DigestValue> im unten angegebenen Beispiel berechnen, aber ich frage mich, wie der andere <ds:DigestValue>5JVZPTwN5Lj0sGTfFzaUeMKCo/xbCAj7fw6TLUFtZIk=</ds:DigestValue> berechnet wird.

Ich bin mit diesem XML als Testfall:

<?xml version="1.0" encoding="UTF-8" xs:xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.2/FacturaElectronica_V.4.2.xsd"?> 
<FacturaElectronica> 
    <Clave>1</Clave> 
    <NumeroConsecutivo>1</NumeroConsecutivo> 
    <FechaEmision>1</FechaEmision> 
    <Emisor>1</Emisor> 
    <Receptor>1</Receptor> 
    <CondicionVenta>1</CondicionVenta> 
    <CondicionVenta>1</CondicionVenta> 
    <MedioPago>1</MedioPago> 
    <DetalleServicio>1</DetalleServicio> 
    <ResumenFactura>1</ResumenFactura> 
    <Normativa>1</Normativa> 
</FacturaElectronica> 

Ich soll es ähnlich wie diese mit etwas zu unterschreiben (Anmerkung: die SignatureValue und die X509Certificate wurden gekürzt):

<ds:Signature Id="id-e34ffbff277e8d1432e864436aa11882" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ds:SignedInfo> 
     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
     <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> 
     <ds:Reference Id="r-id-1" Type="" URI=""> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> 
        <ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath> 
       </ds:Transform> 
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
      <ds:DigestValue>ql0urtXTsc9W0GMIhTdzYHXnQYfnieoIttOBn9fGw7A=</ds:DigestValue> 
     </ds:Reference> 
     <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xades-ide34ffbff277e8d1432e864436aa11882"> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
      <ds:DigestValue>5JVZPTwN5Lj0sGTfFzaUeMKCo/xbCAj7fw6TLUFtZIk=</ds:DigestValue> 
     </ds:Reference> 
    </ds:SignedInfo> 
    <ds:SignatureValue Id="value-ide34ffbff277e8d1432e864436aa11882">Mt1TUuPK3W8/0eRtJX5t45GV9bHvMjw....</ds:SignatureValue> 
    <ds:KeyInfo> 
     <ds:X509Data> 
<ds:X509Certificate>MIIFpTCCBI2gAwIBAgIKK+...</ds:X509Certificate> 
     </ds:X509Data> 
    </ds:KeyInfo> 
    <ds:Object> 
     <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#ide34ffbff277e8d1432e864436aa11882"> 
      <xades:SignedProperties Id="xades-id-e34ffbff277e8d1432e864436aa11882"> 
       <xades:SignedSignatureProperties> 
        <xades:SigningTime>2016-11-25T16:35:06Z</xades:SigningTime> 
        <xades:SigningCertificate> 
         <xades:Cert> 
          <xades:CertDigest> 
           <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
           <ds:DigestValue>LoXZC86JwDL7zWC35qj7Q4AzrRQ=</ds:DigestValue> 
          </xades:CertDigest> 
          <xades:IssuerSerial> 
           <ds:X509IssuerName>CN=CA SINPE - PERSONA FISICA,OU=DIVISION DE SERVICIOS FINANCIEROS,O=BANCO CENTRAL DE COSTA RICA,C=CR,2.5.4.5=#130c342d3030302d303034303137</ds:X509IssuerName> 
           <ds:X509SerialNumber>207422209224813750547132</ds:X509SerialNumber> 
          </xades:IssuerSerial> 
         </xades:Cert> 
        </xades:SigningCertificate> 
        <xades:SignaturePolicyIdentifier> 
         <xades:SignaturePolicyId> 
          <xades:SigPolicyId> 
           <xades:Identifier>https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/Resolucion_Comprobantes_Electronicos_DGT-R-48-2016.pdf</xades:Identifier> 
          </xades:SigPolicyId> 
          <xades:SigPolicyHash> 
           <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
           <ds:DigestValue>NmI5Njk1ZThkNzI0MmIzMGJmZDAyNDc4YjUwNzkzODM2NTBiOWUxNTBkMmI2YjgzYzZjM2I5NTZlNDQ4OWQzMQ==</ds:DigestValue> 
          </xades:SigPolicyHash> 
         </xades:SignaturePolicyId> 
        </xades:SignaturePolicyIdentifier> 
       </xades:SignedSignatureProperties> 
       <xades:SignedDataObjectProperties> 
        <xades:DataObjectFormat ObjectReference="#r-id-1"> 
         <xades:MimeType>application/octet-stream</xades:MimeType> 
        </xades:DataObjectFormat> 
       </xades:SignedDataObjectProperties> 
      </xades:SignedProperties> 
     </xades:QualifyingProperties> 
    </ds:Object> 
</ds:Signature> 
+0

Ok zu bekommen. Aber welches Dokument sende ich zur Unterschrift. In der ersten sende ich das ganze XML. Aber was ist mit dem zweiten Hash? – awavi

Antwort

0

Ich begann gerade in ein ähnliches Thema zu lesen, so ist es nur eine Idee, und ich habe es nicht versucht, aber ich glaube, dass der zweite Hash stammt aus dem xades:SignedProperties Knoten, der Teil der ds:Object ist.

Zumindest die ID (xades-id-e34ff...) im Objekt und in der Referenz sind identisch.

Hoffe das gibt Ihnen (und mir :-D) einen Hinweis.

Grüße, Sebastian

+0

Danke. Ich werde meine Antwort posten, sobald ich es herausgefunden habe. Bitte tun Sie das auch, wenn Sie es auch tun. – awavi

1

Von dem, was ich gelesen here und here, stehe ich, was ich zuvor beschrieben: es ist der Hash-Wert des Knotens SignedProperties ist. Dieser Hash ist Teil des SignedInfo-Knotens, der später signiert wird. Der erste Link ist ein polnischer Blog. Es ist nicht perfekt, aber Google Übersetzer macht einen ziemlich guten Job und die Informationen im Blog haben mir geholfen, klarer zu verstehen.

Sicherstellen, dass der Knoten canonicalized und base64_encode d

P. S .: Suerte con la implementación que está desarrollando para la factura electrónica en Costa Rica ;-D