Nueva pregunta

Pregunta:

Fecha: 10-11-2016 05:06:36 (En Español)

¿Cómo generar el SignatureValue y DigestValue que solicita SUNAT Perú para Factura Electrónica?[No resuelta]

Necesito ayuda para crear las las firmas digitales al enviar a una webservice, les cuento desde el principio pero resumido.

Estoy haciendo un sistema de facturación electrónica a la SUNAT (soy de Perú) y la SUNAT me brindo una URL a donde debo enviar 2 cosas: el nombre del archivo y el archivo en un array de bytes. Dentro del archivo que es .ZIP esta el XML que contiene los datos de la factura y la Firma Digital donde esta mi problema. Al momento de enviarle a SUNAT ellos leen el archivo XML y como respuesta me envia ERROR AL VALIDAR LA FIRMA DIGITAL (code error: 2336), entonces existen 3 tags (SignatureValue, DigestValue, X509Certificate) dentro del XML que buscando información me entere que necesito hacer un calculo matemático para generar las claves de la firma digital. El calculo matemático esta dentro de tag como atributo y la URL es Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" (bueno eso leí). Ahora el envió lo puedo hacer con el objeto SoapClient de PHP y la creacion del XML lo hago mediante DomDocument.

Al comprar la firma digital me dieron un archivo .cer y me dijeron que tenia que subirlo a SUNAT para genera el Key y lo subí y me devolvieron un archivo .KEY y dentro del archivo dice BEGIN RSA PRIVATE KEY (... codigo key encriptado).

Necesito saber como genera la firma digital dentro del XML y donde colocarlo. Gracias

Eso es todo lo que tengo si alguien me puede ayudar les agradecería mucho.
Etiquetas: Certificado Digital - Factura Electrónica - Firma Digital - PHP - Pregunta - SOAP - SoapClient - Webservices Votos: 1 - Respuestas: 24 - Vistas: 77 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 16-11-2016 05:31:03 Hola Anthony, has revisado los manuales de SUNAT?

    Aquí te dejo un enlace a Guías y Manuales

    SignatureValue: contiene la firma codificada en Base64. La firma es el resultado de una serie de transformaciones sobre los datos binarios del elemento <ds:SignedInfo>. El elemento <ds:SignatureValue> contiene este valor binario de la firma codificado en Base64.

    DigestValue: Es el valor hash codificado en Base64.

    Saludos y buen código.
      Votos: 1 - Link respuesta
     
  • Fecha: 29-11-2016 17:05:48 Hola Anthony y Fernando,
    Tengo el mismo problema, Anthony lo llegaste a solucionar???, cuando firmo mi xml y lo envio a la sunat me sale el mismo error: 2336
    Actualmente estoy usando la libreria xmlseclibs.php y las librerias de https://github.com/xmlseclibs
    He hecho todos los pasos que dice en la guia, pero sigo en lo mismo, converse con varias personas y me dijeron que no es posible hacer el firmado y que la sunat lo acepte en php, pero la verdad no lo creo asi.
    El codigo que uso es
    <?php
    // $content = "TEXTO_XML";
    require 'see/AdapterInterface.php';
    		require 'see/XmlseclibsAdapter.php';
    		require 'see/xmlseclibs-master/xmlseclibs.php';
    
    		$ReferenceNodeName = 'ExtensionContent';
    		$privateKey = file_get_contents('see/files/privKey.pem');
    		$publicKey = file_get_contents('see/files/pubKey.pem');
    
    		$domDocument = new \DOMDocument();
    		$objSign = new \FR3D\XmlDSig\Adapter\XmlseclibsAdapter();
    
    		$domDocument->loadXML($xmlstr);
    		$objSign->setDigestAlgorithm();
    		$objSign->setPrivateKey($privateKey);
    		//$objSign->setPublicKey($privateKey);
    		$objSign->setPublicKey($publicKey);
    		$objSign->addTransform(\FR3D\XmlDSig\Adapter\XmlseclibsAdapter::ENVELOPED);
    		$objSign->setCanonicalMethod();
    
    		$objSign->sign($domDocument, $domDocument->getElementsByTagName($ReferenceNodeName)->item(1), "20453904971");
    		
    		$content = $domDocument->saveXML();
    ?>
    


    No entiendo que mas me falta, o en todo caso como podria hacerlo desde el openssl de php?
    o como podria probar si mi firma es correcta??,
    Espero me puedan ayudar.
    Gracias.
      Votos: 1 - Link respuesta
     
  • Fecha: 30-11-2016 05:42:13 Buenas, logre que me aceptaran el documento con la firma, en la homologacion de la sunat, aun me falta probar todos los casos, pero al menos le puede servir a alguien, me descargue el xmlseclib.php y trabaje con eso, les envio el codigo:
    en unos dias, les envio el codigo final, si paso toda la homologación.

    require 'see/lib/xmlseclibs-master/xmlseclibs.php';
    		//return false;
    		$ReferenceNodeName = 'ExtensionContent';
    		$privateKey = file_get_contents('see/files/privKey.pem');
    		$publicKey = file_get_contents('see/files/pubKey.pem');
    
    		$domDocument = new \DOMDocument();
    		$domDocument->loadXML($xmlstr);
    		//$objSign = new \FR3D\XmlDSig\Adapter\XmlseclibsAdapter();
    		//$objSign = new \FR3D\XmlDSig\Adapter\XmlseclibsAdapter();
    		
    		$objSign = new XMLSecurityDSig($ruc);
    		// Use the c14n exclusive canonicalization
    		$objSign->setCanonicalMethod(XMLSecurityDSig::C14N);
    		// Sign using SHA-256
    		$objSign->addReference(
    			$domDocument, 
    			XMLSecurityDSig::SHA1, 
    			array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'),
    			$options = array('force_uri' => true)
    		);
    		
    		$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
    		// Load the private key
    		$objKey->loadKey($privateKey);
    		/* 
    		If key has a passphrase, set it using 
    		$objKey->passphrase = '<passphrase>';
    		*/
    
    		// Sign the XML file
    		$objSign->sign($objKey, $domDocument->getElementsByTagName($ReferenceNodeName)->item(1));
    
    		// Add the associated public key to the signature
    		$objSign->add509Cert($publicKey);
    		
    		// Append the signature to the XML
    		//$objSign->appendSignature($ReferenceNodeName);
    		
    		$content = $domDocument->saveXML();
    
      Votos: 1 - Link respuesta
     
  • Fecha: 19-12-2016 09:32:18 Estimado Miguel, me sale un error en tu código
    Warning: DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1 in /opt/lampp/htdocs/FAC/firmado.php on line 8

    Fatal error: Class 'XMLSecurityDSig' not found in /opt/lampp/htdocs/FAC/firmado.php on line 12

    Por favor si lograste crear la Firma Digital , danos una ayudita por aquí.
    Gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 19-12-2016 11:28:21 Amigo lograstes terminar el modulo para firmar, si puedieras counicarte con nosotros para ver dicho codigo, tenemos otros que podemos intercambiar y te podra ser de mucha ayuda tambien.

    email: elconsultorinformatico@gmail.com
    web: http://contamaxperu.com
      Votos: 0 - Link respuesta
     
  • Fecha: 19-12-2016 16:37:18 Hola Fernando,
    No se como subir archivos al foro, pero el error:
    Fatal error: Class 'XMLSecurityDSig' not found in /opt/lampp/htdocs/FAC/firmado.php on line 12
    lo solucionas descargandote la clase XMLSecurityDSig, de
    https://github.com/robrichards/xmlseclibs

    y con respecto al error de "Warning: DOMDocument::loadXML(): Start tag expected, '<' no"
    me imagino que es porque hay un error al leer el contenido del archivo xml que esta en la variable $xmlstr, solo haz un $xmlstr = file_get_content("facturaoboleta.xml");
      Votos: 0 - Link respuesta
     
  • Fecha: 19-12-2016 16:39:33 Hola Roberto, si llegue a terminar el modulo, estoy en el proceso de homologacion, pero aun no lo he pulido, si tienes alguna duda, puedes escribir por este medio, o sino directamente a mi correo: mpanuera@gmail.com   Votos: 0 - Link respuesta
     
  • Fecha: 20-12-2016 09:16:12 Hola Miguel, no se si me puedes compartir tu código de firmado, ya que e tenido algunos errores y no me sale. espero su pronta respuesta gracias. juan_tk5@hotmail.com   Votos: 0 - Link respuesta
     
  • Fecha: 20-12-2016 09:51:38 Buenas, esta es mi funcion de firmado:
    public function firmar(DOMDocument $domDocument){
    		require 'see/lib/xmlseclibs-master/xmlseclibs.php';
    		//return false;
    		$ReferenceNodeName = 'ExtensionContent';
    		$privateKey = file_get_contents('see/files/privKey.pem');
    		$publicKey = file_get_contents('see/files/pubKey.pem');
    
    		//$domDocument = new \DOMDocument();
    		//$domDocument->loadXML($xmlstr);
    		$objSign = new XMLSecurityDSig($this->ruc);
    		$objSign->setCanonicalMethod(XMLSecurityDSig::C14N);
    		$objSign->addReference(
    			$domDocument, 
    			XMLSecurityDSig::SHA1, 
    			array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'),
    			$options = array('force_uri' => true)
    		);
    		
    		$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
    		$objKey->loadKey($privateKey);
    		
    		// Sign the XML file
    		$objSign->sign($objKey, $domDocument->getElementsByTagName($ReferenceNodeName)->item(1));
    		// Add the associated public key to the signature
    		$objSign->add509Cert($publicKey);
    		return $domDocument;
    	}
    


    No puedo agregar archivos, pero el xmlseclibs.php
    bajenlo de internet, es una libreria muy conocida, busquenla como xmlseclibs.php
      Votos: 1 - Link respuesta
     
  • Fecha: 13-02-2017 04:19:22 Hola @Miguel Panuera estoy realizando el mismo proceso de firmado del documento XML pero no tengo exito aún, pero según el ejemplo de la libreria hace el firmado correctamente pero hay algo que creo esta faltando y que lo pide SUNAT

    <ext:UBLExtension>
    			<ext:ExtensionContent>
    				<Signature Id="STONER" xmlns="http://www.w3.org/2000/09/xmldsig#">
    					<SignedInfo>
    						<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
    						<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
    						<Reference URI="">
    							<Transforms>
    								<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
    							</Transforms>
    							<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
    							<DigestValue>2Zm/keM9g5A2NGAHWptFxz0Oa4E=</DigestValue>
    						</Reference>
    					</SignedInfo>
    					<SignatureValue>TODO EL CODIGO CIFRADO</SignatureValue>
    					<KeyInfo>
    						<X509Data>
    							<X509SubjectName>E=copegareirl@hotmail.com, CN=MARIO DUBERLY GARCIA PERICHE, OU=Identidad validada por GRAMD, OU=43771641, OU=20530195016, O=CORPORACION PESQUERA GARPER E.I.R.L., L=PIURA, C=PE</X509SubjectName>
    							<X509Certificate>MASCODIGO CIFRADO</X509Certificate>
    						</X509Data>
    					</KeyInfo>
    				</Signature>
    			</ext:ExtensionContent>


    En el tag X509SubjectName hay datos correspondientes al ejemplo que creo esta librería no los incluye al momento del firmado pero que SUNAT lo pide.... ya lo haz realizado..? podrás compartir parte de tu código por favor.. desde ya gracias :) estaré atengo por si respondes. Saludos desde Piura - Perú
      Votos: 0 - Link respuesta
     
  • Fecha: 22-09-2017 09:09:41 Buenas tardes compañeros alguien a podido hacer el Id="2043030333" que va en el <ds:Signature Id="2043030333"> alguien me podria dar un alcance de donde debo de apuntar.   Votos: 0 - Link respuesta
     
  •  
      0  
     
    Fecha: 30-10-2017 09:33:54 Hola Roberto,

    Yo agregué un atributo (idsign) a la clase XMLSecurityDSig, le asigné valor al momento de crear el objeto y cambié una línea del constructor de la clase

    Esta línea:
    $template = self::BASE_TEMPLATE;


    Por esta otra:
    if($idsign != null){
    $this->idsign = $idsign;
    $base = '<Signature Id="'.($this->idsign).'" xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
    <SignatureMethod />
    </SignedInfo>
    </Signature>';
    $template = $base;
    }else{
    $template = self::BASE_TEMPLATE;
    }
    if(! empty($prefix)) {
    $this->prefix = $prefix.':';
    $search = array("<S", "</S", "xmlns=");
    $replace = array("<$prefix:S", "</$prefix:S", "xmlns:$prefix=");
    $template = str_replace($search, $replace, $template);
    }
    $sigdoc = new DOMDocument();
    $sigdoc->loadXML($template);
    $this->sigNode = $sigdoc->documentElement;
    }

    Espero te sirva

    Saludos
      Votos: 0 - Link respuesta
     
  •  
      0  
     
    Fecha: 31-10-2017 18:53:25 Hola Miguel, he probado el codigo y me sale el siguiente error:

    Warning: DOMDocument::loadXML(): StartTag: invalid element name in Entity, line: 1 in C:\AppServ\www\xmlseclibs-master\src2\XMLSecurityDSig.php on line 119

    Warning: DOMDocument::loadXML(): Extra content at the end of the document in Entity, line: 1 in C:\AppServ\www\xmlseclibs-master\src2\XMLSecurityDSig.php on line 119

    Fatal error: Call to a member function getElementsByTagName() on string in C:\AppServ\www\xmlseclibs-master\firmar2.php on line 41
      Votos: 0 - Link respuesta
     
  • Fecha: 16-01-2018 09:22:30 buen dia compañeros,
    soy de colombia y estoy haciendo la facturacion electronica para la DIAN..
    en este momento estoy atascado en la firma digital del XML e utilizado la libreria(xmlseclibs) pero no me da todo el alcanze que necesito.. al utilizarla y firmar el XML me genera halgo como lo siguiente
    <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="">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                            <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>XEkesKSsqe3h42fk/Q7rem8JRBQ=</ds:DigestValue>
                    </ds:Reference>
              </ds:SignedInfo>
              <ds:SignatureValue>UReblw/9jlo1NCQJ1zvKnEsaPpIoJ5SaNKu5KGKFbhqKLNCqKnD1d7umECoaHQRPJjt45fGcaNkjzjpaiOrgemJfu1NMTogw2BG7iYHHvGyUPEYz5dzrDvzhsMClM882qk+dMJ7i55IlKYTMFRwU19XRRi09VX7bO9IL52qn/cbhxF6023PE3Ddo9aa2FcUIso3DiaSP6OwQjbiejIuhYugXNNg2/L51wWTbCu2GjzjKDe43avTSk7IUbJs5Egl4x0ho05dn8RcgjFdRQ6DlNAN7zru5FmAT2kwr3NmbbdXkha/zJmmcVFQ7y2K7g5NThtA30274M4NCPbO0i/v21gqj2XdrxjWGaFsoMR0KxEryz4MBtALzOcwUJrlSUX+h/eA10Pewz8v51YrRmVFepzXARe/CCFf/4ezhoyrr0vNRw7lDyzKMB6HRC1e7ALmpCjUVBFUkXBwnM3Z5xd00q6YHYxCrTHKALIpTWHEzxZFyqNjenA0R6P1V/z8MHEqB2G46Ts9J36dN8rtgkEEEA1Gv2wnpoHH0FcYSG91oFXZ36nkaLmroJkpKx9Z97d4t7FTgXCksuc1u4OksifTx60hYpWszpWTTjOkzJQn2QwcRoJkeAYbdN5t4G1A+veZmUhXLaHNd5XnGlOa+qjwwsCxDg8TUWYbTofxpSl/2cjgal6buVSn+zO1Ot4fO93H+eN+b/sfDPrquv7i1/LN7gY54tQZOfGreBRT9CNPK+qubRjgsq4RwI+iHEl/d8RyQyA+SiftNUFQTdmbCBkihR/mjziL70p4JONABHDkCUr/ZKvZfvtql521fB2p2amtKkN+XovRct8HXbeBZX6FnfcP1+OOT8SN9a6oz6B6QaHQmxez5hC1PznoF247kbrY228UAs3nX4maK6L19YXJQAkPZlwSLDgzNouKGnQdn+Zs8xof4ohC/baooLNNoDxrlgzjGln4pvgwWcyw6n0dagGrDbGeF2RThSGPCwLT3fi8Ol02kHjLHHOu6kV81JYYyCAvn7WgVJBR9vCSrm++hCPuQEVmxyPvSu8LBl1c+OTQH7zfxs+kzO6dzjCSR6FFQWBkGWX/Cllay8X/jbEvrt33AU3klQIeYyBLOv8kV7n5oEU5SzRKwgNKOTUJwPZm24RyUzrMyHbkYDus8YxigDEJypQmVBY4Aou75KFLQOQ3uKWYK9xySAefDIXacTXH6oZH/znZiEB/7h41FaEW1rvDvkV+hrfBwrsEPfBYv4Z9yoMjrayFBVf9mlh3fbrhe+NcjYGJ71peMHaiBNuAavqnThQ/f6eyP9V/NMtlitpgMw24UNfq203yb0+wLu2ewonnV9o/TmnkGXLNAOkB6gA==</ds:SignatureValue>
              <ds:KeyInfo>
                  <ds:X509Data>
                      <ds:X509Certificate>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</ds:X509Certificate>
                  </ds:X509Data>
              </ds:KeyInfo>
              </ds:Signature>



    lo cual me sirve demaciado, pero al momento de revisar detenidamente la estructura que pide la DIAN en colombia es algo como lo siguiente..
    <ds:Signature Id="xmldsig79c270e350bb4fcfb9bc3a95bcf2466d">
              <ds:SignedInfo>
                <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/RECxmlc14n20010315"/>
                <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsasha1"/>
                <ds:Reference Id="xmldsig79c270e350bb4fcfb9bc3a95bcf2466dref0" URI="">
                  <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#envelopedsignature"/>
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>21GME6Y4G7l+35aMpi+nzB/Di88=</ds:DigestValue>
                </ds:Reference>
                <ds:Reference URI="#xmldsig79c270e350bb4fcfb9bc 3a95bcf2466dsignedprops">
                  <ds:DigestValue>k/NyUxvsY6yGVV61NofEz5FaNmU=</ds:DigestValue>
                </ds:Reference>
                <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig79c270e350bb4fcfb9bc 3a95bcf2466dsignedprops">
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                </ds:Reference>
              </ds:SignedInfo>
              <ds:SignatureValue Id="xmldsig79c270e350bb4fcfb9bc3a95bcf2466dsigvalue">AvkA/W71FvZs659Id1Xrn9JMgYY1gaEVWtek/6DcqA9FvezeUPxGWCXQ07rgCSDMMdz2mX6nbp3LDscgWqVy4VIogV/zok60j92iFRjCUzUGI6MVON5G8jxX+dZkZRjFAEAwLQvoYJo/1rxLFQ+uQYZ3kp/O+bDfQ+ybPagoDAQbU/vdrZnC9fzS7C9X0MlKqkGUIKJp+4MztMPjDmnfPKagrWo1T51N9TfAxR4KHhFDAtEDFB/55dAI3lAiI7TL5US6Ety+D1taefGj48lVsEDNo+kbe/7UcdYSiww+QX/BSpgPAV7+Zh/GdR8u+FMe/ut+WidNpZseIynWIE1uYA==</ds:SignatureValue>
              <ds:KeyInfo Id="xmldsig87d128b5aa314f0b8e453d9cfa0eec26keyinfo">
                <ds:X509Data>
                  <ds:X509Certificate>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</ds:X509Certificate>
                </ds:X509Data>
              </ds:KeyInfo>
              <ds:Object>
                <xades:QualifyingProperties Target="#xmldsig79c270e350bb4fcfb9bc3a95bcf2466d">
                  <xades:SignedProperties Id="xmldsig79c270e350bb4fcfb9bc3a95bcf2466dsignedprops">
                    <xades:SignedSignatureProperties>
                      <xades:SigningTime>20150630T20:56:11.67505:00</xades:SigningTime>
                      <xades:SigningCertificate>
                        <xades:Cert>
                          <xades:CertDigest>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                            <ds:DigestValue>YGJTXnOzmebG2Mc6A/QapNi1PRA=</ds:DigestValue>
                          </xades:CertDigest>
                          <xades:IssuerSerial>
                            <ds:X509IssuerName>C=CO,L=Bogota D.C.,O=Andes SCD.,OU=Division de certificacion entidad final,CN=CA ANDES SCD S.A.Clase II,1.2.840.113549.1.9.1=#1614696e666f40616e6465737363642e636f6d2e636f</ds:X509IssuerName>
                            <ds:X509SerialNumber>9128602840918470673</ds:X509SerialNumber>
                          </xades:IssuerSerial>
                        </xades:Cert>
                        <xades:Cert>
                          <xades:CertDigest>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                            <ds:DigestValue>6EVr7OINyc49AgvNkie19xul55c=</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 SCDS.A.,1.2.840.113549.1.9.1=#1614696e666f40616e6465737363642e636f6d2e636f</ds:X509IssuerName>
                            <ds:X509SerialNumber>7958418607150926283</ds:X509SerialNumber>
                          </xades:IssuerSerial>
                        </xades:Cert>
                        <xades:Cert>
                          <xades:CertDigest>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                            <ds:DigestValue>2el6MfWvYsvEaa/TV513a7tVK0g=Ohixl6upD6av8N7pEvDABhEL6hM=</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 SCDS.A.,1.2.840.113549.1.9.1=#1614696e666f40616e6465737363642e636f6d2e636f</ds:X509IssuerName>
                            <ds:X509SerialNumber>3248112716520923666</ds:X509SerialNumber>
                          </xades:IssuerSerial>
                        </xades:Cert>
                      </xades:SigningCertificate>
                      <xades:SignaturePolicyIdentifier>
                        <xades:SignaturePolicyId>
                          <xades:SigPolicyId>
                            <xades:Identifier>http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf</xades:Identifier>
                          </xades:SigPolicyId>
                          <xades:SigPolicyHash>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                            <ds:DigestValue>Ohixl6upD6av8N7pEvDABhEL6hM=</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>



    con muchas mas etiquetas y cosas que desconozco de donde salen...
    si hay halguien que me pueda ortientar o dar una luz, les agradezco mucho...
    trabajo en PHP... y el estandar de la firma es XADES-EPES
      Votos: 3 - Link respuesta
     
  • Fecha: 26-07-2018 10:39:51 Hola Miguel, te agradezco por tu aporte, pero al correr tu codigo y por mas que descargue la liberia xmlseclibs, me sigue saliendo el mismo error Fatal error: Class 'XMLSecurityDSig' not found in C:\xampp\htdocs\FIRMA...

    hay algun cambio que realizar a la libreria? o algo asi desde ya gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 26-07-2018 11:19:12 Si, recuerdo que cuando lo descargue le hice modificaciones en los includes o requires, para que jale correctamente.   Votos: 0 - Link respuesta
     
  • Fecha: 20-08-2018 12:25:33 Hola Miguel, también tengo ese problema con la librería, me muestra el error "Class 'XMLSecurityDSig' not found in..."

    cuales fueron los cambios que hiciste en la librería? Gracias de antemano.
      Votos: 0 - Link respuesta
     
  • Fecha: 20-08-2018 13:05:27 Hola, a mi me funciona perfectamente. Este es mi código:

    //Esto esta fuera de la clase
           use RobRichards\XMLSecLibs\Xmlsecuritykey;
    	use RobRichards\XMLSecLibs\Xmlsecuritydsig;
    	
    	include ('./application/libraries/xmlseclib/xmlsecuritydsig.php');
    	include ('./application/libraries/xmlseclib/xmlsecuritykey.php');
    
    //Aca lo meti en una funcion que está dentro de una clase
    //xmlFile es la ruta exacta donde esta el XML que vas a firmar
    //public y privatePath son del certificado
    
    //xmlpath es solo la ubicacion donde está, sin el nombre del archivo en xmlFile esta la ubicacion + el //nombre del archivo
    
    //xmlName es solo el nombre del archivo xml sin la ruta
             public function signBill($xmlFile,$publicPath,$privatePath,$xmlpath,$xmlName){
    				
    		$ReferenceNodeName = 'ExtensionContent';
    		
    		$privateKey = file_get_contents($privatePath);
    		
    		$publicKey = file_get_contents($publicPath);
    		
    		$domDocument = new DOMDocument();
    		$domDocument->load($xmlFile);
    		
    		$objSign = new Xmlsecuritydsig();
    		
    		$objSign->setCanonicalMethod(XMLSecurityDSig::C14N);
    	
    		$objSign->addReference(
    				$domDocument,
    				XMLSecurityDSig::SHA1,
    				array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'),
    				$options = array('force_uri' => true)
    				);
    		
    		$objKey = new Xmlsecuritykey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
    		
    		$objKey->loadKey($privateKey);
    		
    		$objSign->sign($objKey, $domDocument->getElementsByTagName($ReferenceNodeName)->item(0));
    		
    		$objSign->add509Cert($publicKey);
    				
    		$content = $domDocument->save($xmlpath.$xmlName);
    		
    	}


    Si tienes alguna duda con gusto en lo que pueda te ayudo
      Votos: 1 - Link respuesta
     
  • Fecha: 20-08-2018 14:03:39 Hola Adrian, haz realizado alguna modificación en la librería xmlseclibs?   Votos: 0 - Link respuesta
     
  • Fecha: 23-08-2018 12:19:05 Hola Diego, no hice modificaciones sobre el xmlseclibs   Votos: 0 - Link respuesta
     
  • Fecha: 02-10-2018 17:33:42 Buenas noches, adjunto un cambio que realicé al momento extraer el certificado:

    $publicKey = file_get_contents($publicPath);
    if (openssl_pkcs12_read(file_get_contents("RRRRRRRRRR.pfx"), $certs, "aqui el password del certificado")) {

    $privateKey = openssl_pkey_get_private($certs['pkey']);
    }

    fue el único cambió.
    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 05-12-2018 18:36:38 Hola @Jhonatan W. Ocampo si miras mi mensaje y ya resolviste tu problema, podrias compartirme la solucion ?, yo genero el XML firmado pero no logro saber como generar y colocar el argumento ID que va en la etiqueta Signature y Reference...
    Uso PHP y la libreria xmlseclibs
    Saludos !
      Votos: 0 - Link respuesta
     
  • Fecha: 23-12-2018 02:22:16 Hola Jhonatan y Angel tengo el mismo problema con la dian, si encuentran una solucion podria compartirla por favor, si encuentro alguna, la compartire.

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 28-07-2023 07:18:56 Buenas tardes por favor si me pueden ayudar estoy tratando de firmar un xml con firma .p12
    me sirve esta clase?

    $privateKey = openssl_pkey_get_private($certs['pkey']);

    esto me devuelve . Resource id #9

    Muchas gracias de antemano
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com