Saltar a contenido

Greener XMLDsig

Esta libreria permite realizar la firma digital de los documentos XML con un certificado electrónico, siguiendo la normativa de SUNAT.

Instalar

composer require greenter/xmldsig

Requerimientos

Se necesitar tener habilitado la extension openssl en php.ini

extension=openssl

Uso

Para este ejemplo necesitamos un archivo XML previamente generado, debemos asegurarnos de incluir la etiqueta <ext:ExtensionContent/>, que es donde se agregará el nodod de la firma.

<?php

use Greenter\XMLSecLibs\Sunat\SignedXml;

$xml = file_get_contents('20600995805-01-F001-1.xml');
$cert = file_get_contents('certifcate.pem');

$signer = new SignedXml();
$signer->setCertificate($cert);

$xmlSigned = $signer->signXml($xml);

file_put_contents("signed.xml", $xmlSigned);
El resultado seria:

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
   <ext:UBLExtensions>
    <ext:UBLExtension>
      <ext:ExtensionContent>
            <ds:Signature Id="SignIMM">
                <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="">
                    <ds:Transforms>
                        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                    </ds:Transforms>
                    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                    <ds:DigestValue>IwJuNQGQaHmmm3iv2jj8JDv70Ow=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>
                nLaghokzMNrmrfPnbIg9b...WluZTE1UiLFwZXXXPUlf2o=
                </ds:SignatureValue>
                <ds:KeyInfo>
                    <ds:X509Data>
                        <ds:X509Certificate>
                        MIIFhzCCA3OgAwI...BgNVBAYTAlVTVQQIEwVNYWluZTEgMOiRJ00nE=
                        </ds:X509Certificate>
                    </ds:X509Data>
                </ds:KeyInfo>
            </ds:Signature>
      </ext:ExtensionContent>
    </ext:UBLExtension>
   </ext:UBLExtensions>
   <cbc:UBLVersionID>2.1</cbc:UBLVersionID>
   <cbc:CustomizationID>2.0</cbc:CustomizationID>
   <cbc:ID>F001-1</cbc:ID>
<!--....-->
</Invoice>

Datos a considerar:
<ds:DigestValue>: Valor Resumen codificado en base64, utilizado en la representación impresa y codigo QR.
<ds:SignatureValue>: Valor de la Firma codificado en base64.
<ds:X509Certificate>: Contenido del certificado, necesario para verificar la autenticidad del documento.

Otros formatos de certificado

Puedes seguir esta guía, para convertir un certificado al formato requerido.