[PHP] Como Firmar usando XMLSECLIBS ?

Todo lo que no cabe en los demas foros........
angelcantu84
Mensajes: 2
Registrado: Sab Dic 08, 2018 4:29 pm

[PHP] Como Firmar usando XMLSECLIBS ?

Mensajepor angelcantu84 » Sab Dic 08, 2018 4: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:

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>


Pero basandome en la doc del repositorio solo he logrado hacer esto:

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>


Y el codigo que hice para obtener el XML firmado que mencione arriba:

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);
?>
Última edición por angelcantu84 el Sab Dic 08, 2018 4:48 pm, editado 5 veces en total.

angelcantu84
Mensajes: 2
Registrado: Sab Dic 08, 2018 4:29 pm

Re: [PHP] Como Firmar usando XMLSECLIBS ?

Mensajepor angelcantu84 » Sab Dic 08, 2018 4:43 pm

En conclusion falta:

1) Insertar contenido dentro de URI
2) Insertar el argumento Id="algo"
3) Insertar la etiqueta <object>

He buscado en muchas partes, he leido el grupo casi completo y dudas como estas estan inconclusas :S

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: [PHP] Como Firmar usando XMLSECLIBS ?

Mensajepor Dado » Sab Dic 08, 2018 6:19 pm

Antes de darte mi opinion considera que no soy experto en el tema, que igual lo que voy a decir son puras babosadas, pero sinceramente considero que podria tener algo de cierto mi comentario

Lo primero es el Id, este es un "nombre" que le vas a asignar al nodo, un identificador y literalmentepuede ponerlo lo que quieras, por ejemplo Id="Nodo principal"

Aunque por lo que veo estan usando un UUID, que es ese grupo de 8-4-4-4-12 digitos, ese UUID es totalmente inventado y se intenta que no se repita nunca (lleva un componente que depende del tiempo, de esa forma medio garantizan que no existan dos UUID iguales), pero insisto, es totalmente arbitrario, es solo para darle un nombre a ese nodo

Lo que sigue es el URI, normalmente ese indicaque nodo es el que se esta firmando, si lo dejas en blanco significa que se esta firmando el nodo superior, pero si no entonces debe coincidir con un Id previo

Asi pues si tienes un Id="Nodo superior" y ese es el nodo que firmas entonces el URI debeser "Nodo superior"

Checa esta entrada del foro y tambien esta otra, no tiene que ver *exactamente* con tu tema, pero incluye una firmatipo <SignedInfo>como la que estas tratando de implementar

Por ultimo el nodo <Object> meparece que es la cadena CA (certificate autority) que detalla como se ha formado la cadena de autoridad del certificado (quien es el padre y el abuelo del certificado que se esta usando)

Por ejemplo aqui en Mexico (me parece que tu estas escribiendo desde Colombia, es correcto?) nuestro abuelo de certificados es el Banco de Mexico y el padre es el SAT (Servicio de Administracion Tributaria)

_______________________________________
malditotecladoyanolefuncionabienelespacio....una disculpa por los textos encimados
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!


Volver a “Otros”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados