[PHP] Como Firmar usando XMLSECLIBS ?
Publicado: Sab Dic 08, 2018 3:42 pm
Buenas Gente del Foro...
IMPORTANTE: esto no tiene nada que ver con CFDi de Factura Electrónica, es un caso particular para cumplir con el Firmado de un XML personal...
Estoy usando XMLSECLIBS (https://github.com/robrichards/xmlseclibs) en PHP y tengo problemas para generar el firmado de un XML, requiero indicar ciertos valores en el URI y ademas incluir el argumento Id="algo..." dentro de la etqieuta <Signature...> pero no logro hacer que XMLSECLIBS haga el procedimiento.
En la red hay muy poca documentacion y ejemplos, aparte el Grupo que tienen ellos esta desatendido
...
Les paso el ejemplo de lo que debo conseguir:
Pero basandome en la doc del repositorio solo he logrado hacer esto:
Y el codigo que hice para obtener el XML firmado que mencione arriba:
IMPORTANTE: esto no tiene nada que ver con CFDi de Factura Electrónica, es un caso particular para cumplir con el Firmado de un XML personal...
Estoy usando XMLSECLIBS (https://github.com/robrichards/xmlseclibs) en PHP y tengo problemas para generar el firmado de un XML, requiero indicar ciertos valores en el URI y ademas incluir el argumento Id="algo..." dentro de la etqieuta <Signature...> pero no logro hacer que XMLSECLIBS haga el procedimiento.
En la red hay muy poca documentacion y ejemplos, aparte el Grupo que tienen ellos esta desatendido

Les paso el ejemplo de lo que debo conseguir:
Código: Seleccionar todo
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-ba64dd6b-98e2-406b-aff7-5fcf307d91e4">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference Id="xmldsig-ba64dd6b-98e2-406b-aff7-5fcf307d91e4-ref0" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>AHr5HQkgPIoHfvTofP............</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-ba64dd6b-98e2-406b-aff7-5fcf307d91e4-signedprops">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>05W4VLwaDzCUsZBw............</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue Id="xmldsig-ba64dd6b-98e2-406b-aff7-5fcf307d91e4-sigvalue">
GU6QNnZV23mx95/X8aZq84F1Ui.........
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIIoTCCBomgAwIBAgI............
</ds:X509Certificate>
<ds:X509SubjectName>
c=CO,st=Cundinamarca,l=Bogota,ou=Certificado de Persona Juridica emitido por Andes SCD Av. Carrera 45 No 103 - 34 OF 205,title=Persona Juridica,serialNumber=11111111,cn=Usuario de Pruebas,1.2.840.113549.1.9.1=nomeempresa@empresaparapruebas.com,street=Calle Falsa No 12 34
</ds:X509SubjectName>
<ds:X509IssuerSerial>
<ds:X509IssuerName>
c=PAIS,l=CIUDAD.,o=Andes SCD.,ou=Division de certificacion entidad final,cn=CA EMPRESA NOMBRE. Clase II,1.2.840.113549.1.9.1=info@empresa.com
</ds:X509IssuerName>
<ds:X509SerialNumber>6605235............</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#" Target="#xmldsig-ba64dd6b-98e2-406b-aff7-5fcf307d91e4">
<xades:SignedProperties Id="xmldsig-ba64dd6b-98e2-406b-aff7-5fcf307d91e4-signedprops">
<xades:SignedSignatureProperties>
<xades:SigningTime>2018-11-09T09:21:07.452-05:00</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>myUTxwDyNtuaYD............</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>
c=PAIS,l=CIUDAD,o=Andes SCD.,ou=Division de certificacion entidad final,cn=CA ANDES SCD S.A. Clase II,1.2.840.113549.1.9.1=info@andesscd.com.co
</ds:X509IssuerName>
<ds:X509SerialNumber>660523518............</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>oEsyOEeUGTXr4............</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>
c=PAIS,l=CIUDAD,o=Andes SCD,ou=Division de certificacion,cn=ROOT CA BLABLA,1.2.840.113549.1.9.1=info@empresa.com
</ds:X509IssuerName>
<ds:X509SerialNumber>81368673............</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>Cs7emRwtXWVYHJ............</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>
c=CO,l=Bogota D.C.,o=Andes SCD,ou=Division de certificacion,cn=ROOT CA ANDES SCD S.A.,1.2.840.113549.1.9.1=info@andesscd.com.co
</ds:X509IssuerName>
<ds:X509SerialNumber>31843............</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
<xades:SignaturePolicyIdentifier>
<xades:SignaturePolicyId>
<xades:SigPolicyId>
<xades:Identifier>
https://www.miempresa.com/direc/torio/archivo.pdf
</xades:Identifier>
<xades:Description>
Texto personalizado sobre la emision de esta Factura
</xades:Description>
</xades:SigPolicyId>
<xades:SigPolicyHash>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>dMoMvtcG5aIz............</ds:DigestValue>
</xades:SigPolicyHash>
</xades:SignaturePolicyId>
</xades:SignaturePolicyIdentifier>
<xades:SignerRole>
<xades:ClaimedRoles>
<xades:ClaimedRole>supplier</xades:ClaimedRole>
</xades:ClaimedRoles>
</xades:SignerRole>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
Código: Seleccionar todo
<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/2001/04/xmldsig-more#rsa-sha256"/>
<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/2001/04/xmlenc#sha256"/>
<ds:DigestValue>7DSM/xRnyjkS8i............</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
Wm0TSXZyZn7qEoga3z............
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509SubjectName>
serialNumber= / CURP,x500UniqueIdentifier=Rfc / Rfc,emailAddress=empresa@miempresa.com,C=MX,O=NOMBRE EMPRES SA,name=NOMBRE EMPRES SA,CN=NOMBRE EMPRESA SA
</ds:X509SubjectName>
<ds:X509IssuerSerial>
<ds:X509IssuerName>
unstructuredName=Responsable: Administracion Tributaria,x500UniqueIdentifier=Rfc,L=Localidad,ST=Estado Federal,C=MX,postalCode=06300,street=Direccion,emailAddress=cert@cerempresa.com,OU=Tributaria,O=Tributaria,CN=A.C. del Servicio de Administración Tributaria
</ds:X509IssuerName>
<ds:X509SerialNumber>27510619055773............</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>
MIIGvDCCBKSgAw............
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
Código: Seleccionar todo
<?php
$xml= new DOMdocument( "1.0", "UTF-8" );
/* ...archivo el XML con las etiquetas que necesito... */
$objDSig = new XMLSecurityDSig();
$objDSig->setCanonicalMethod(XMLSecurityDSig::C14N);
$objDSig->addReference($xml, XMLSecurityDSig::SHA256, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'), array('force_uri'=>true, 'overwrite'=>true));
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, array('type'=>'private'));
$objKey->passphrase= "miclavetextual";
$objKey->loadKey("/ruta/archivo/firma.pem", TRUE);
$objDSig->sign($objKey);
$options = array('issuerSerial' => true, 'subjectName' => true, );
$objDSig->add509Cert(file_get_contents("/ruta/archivo/cert.pem"), true, false, $options);
$objDSig->appendSignature($xml->documentElement);
?>