Cómo se firma el DTE
Bueno en este tema existen muchos que pueden dar
una opinión acerca de cómo realizar esta tarea, sin embargo la experiencia me
ha demostrado que el problema no es firmar el documento sino más bien que es lo
que debemos firmar. Muchas personas me dicen que firman sus documentos DTE pero
al momento de enviarlos al SII este les regresa que la firma es inválida.
Expondré aquí la forma que utilizo personalmente para realizar el proceso, sin
perjuicio que existan otros desarrolladores que utilicen una forma mas elegante.
Consideraciones generales
Una de las primeras cosas que
realizo al momento de intentar firmar el documento DTE es ordenar la
información a firmar. Los desarrolladores con más experiencia en este tema
saben que al construir un documento XML este no es necesariamente el mismo
cuando uno lo visualiza en otros visualizadores de documentos XML. Bueno
regresando a lo nuestro, primero ordenemos el DTE
Identación
Si Ud. Cuenta con un documento
DTE con estas características lo primero que debería hacer es quitar la
identación del documento. Esto tiene una razón, puesto que el CAF entregado por
el SII no trae identación es preferible dejar todo el documento alineado según el
CAF. Entonces al momento de calcular la firma sobre el CAF no generará errores
de timbre. Esta es mi opinión, no exenta de comentarios y observaciones.
Deje el documento DTE de esta forma.
CAF
Una vez ordenado el documento
DTE, es necesario agregar el CAF al documento, para esto es necesario tomar el
nodo CAF desde el archivo de autorización de folios del SII. Cuando digo tomar,
es rescatar el nodo sin realizar ninguna modificación o identación. El nodo CAF
debe ser insertado tal cual en el documento DTE. Si se modifica de alguna forma
el cálculo del timbre fallará.
Entonces segun esto el DTE debería quedar como sigue:
Posterior a esto se encuentra la generación del timbre del TED, cuya información se encuentra disponible en la sección Ejemplo Timbre Electrónico del DTE . Cuando genere el timbre del TED su DTE debería tener esta forma:
Aplicar Firma al DTE
Bueno ya
tiene preparado su DTE para ser firmado. Ahora debemos aplicar la siguiente
rutina de firma al DTE expuesto. Antes debo señalar que al momento de abrir el
documento XML en .Net utilice la propiedad PreserveWhiteSpace = true del objeto
XmlDocument. Esto logra abrir el DTE sin ordenar los nodos o identarlo. Si no
lo hace de esta forma el timbre que calculo se invalidará.
Una vez abierto el DTE (xml) puede aplicar esta rutina para su firmado:
#region FIRMA DTE public static void firmarDocumentoXml(ref XmlDocument xmldocument, X509Certificate2 certificado, string referenciaUri ) { //// //// Cree el objeto SignedXml donde xmldocument //// representa el documento DTE preparado para //// ser firmado. Recuerde que debe ser abierto //// con la propiedad PreserveWhiteSpace = true SignedXml signedXml = new SignedXml(xmldocument); //// //// Agregue la clave privada al objeto signedXml signedXml.SigningKey = certificado.PrivateKey; //// //// Recupere el objeto signature desde signedXml Signature XMLSignature = signedXml.Signature; //// //// Cree la refrerencia al documento DTE //// recuerde que la referencia tiene el //// formato '#reference' //// ejemplo '#DTE001' Reference reference = new Reference(); reference.Uri = referenciaUri; //// //// Agregue la referencia al objeto signature XMLSignature.SignedInfo.AddReference(reference); KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new RSAKeyValue((RSA)certificado.PrivateKey)); //// //// Agregar información del certificado x509 keyInfo.AddClause(new KeyInfoX509Data(certificado)); XMLSignature.KeyInfo = keyInfo; //// //// Calcule la firma y recupere la representacion //// de la firma en un objeto xmlElement signedXml.ComputeSignature(); XmlElement xmlDigitalSignature = signedXml.GetXml(); //// //// Inserte la firma en el documento DTE xmldocument.DocumentElement.AppendChild(xmldocument.ImportNode(xmlDigitalSignature, true)); } #endregion
Para ser honesto esta rutina es capaz de firmar el DTE y El SETDTE solo se debe pasar la referencia adecuada para indicar que nodo debe firmar.
Bueno espero que esta breve rutina les permita avanzar en sus proyectos. Como siempre los invito a dejar un comentario acerca de como mejorar estas rutinas.
estimado una consulta, existe alguna instruccion en .net para agregar el CAF desde xml?
ResponderEliminarEstimado, no existe una instrucción que haga eso directamente, debes crear una rutina que extraíga el contenido del CAF sin nodificaciones y lo inserte como nodo al documento DTE. Te recomiendo que lo extraígas utilizando XmlDocument y antes de cargar el CAF en este objeto le indiques PreserveWhiteSpace = true. Eso abre el CAF sin ordenarlo. Que es lo que necesitas para trabajar con el. Si tienes problemas escribeme nuevamente y te envío mas información.
EliminarEstimado, no existe una instrucción que haga eso directamente, debes crear una rutina que extraíga el contenido del CAF sin nodificaciones y lo inserte como nodo al documento DTE. Te recomiendo que lo extraígas utilizando XmlDocument y antes de cargar el CAF en este objeto le indiques PreserveWhiteSpace = true. Eso abre el CAF sin ordenarlo. Que es lo que necesitas para trabajar con el. Si tienes problemas escribeme nuevamente y te envío mas información.
ResponderEliminarte pasaste muchas gracias....pero estoy con una duda que te escriba mas abajo
Eliminarfirme con la rutina que indicas, pero no se supone (segun recuerdo de la doc. del sii) que los tag (X509Certificate y SignatureValue) deben ser a lo mas de 76 caracteres por linea, lo que a mi me genera es todo en una sola linea???
ResponderEliminarEs verdad pero yo en el tiempo he enviado muchos DTEs con este formato y el SII los acepta sin problemas. Descubrí esto hace varios años y no he tenido problemas. Tambien puedes crear una rutina que ordene el nodo x509certificate. Tambien te funcionará.
EliminarEstimado tengo una duda en el cierre del nodo despues sigue bck8Cq2y6yP86bof2jXc87YZeranEDR8ZMXCmqWTb9iTA6wBSy2G5x3OSNtKu+04Vq8tZ/SL2POlBAmJDYl8+g== esto se casa igual del CAF, lo que pasa que no puedo extraer --algoritmo="SHA1withRSA"-- esta seccion me toma solo el contendo
ResponderEliminarHola marcelo, seguí tu blog desde la web del programador y la verdad me parece excelente que compartas esta información sin ningún afán de lucro, solo me queda una duda, yo programo con clipper 5.2, como puedo generar y conectar al servidor para enviar y recibir todo lo que explicas aquí en tu blog??, no estoy familiarizado con muchos términos que utilizas en verdad. disculpa la ignorancia, te escribo desde México, serán tus términos diferentes por la nación?, aquí no he leído nada igual, saludos!!!
ResponderEliminarEstimado colega,
EliminarVoy a revisar mis documentos y te cuento si puedo ayudarte con tus desarrollos.
Gracias por tus comentarios.
marcelo.
ResponderEliminarse puede bajar el listado de emisores autorizados??
Logan,
EliminarPuedes entrar a la pagina del SII en esta url
https://palena.sii.cl/cvc/dte/ee_empresas_dte.html
luego seleccionas los emisores que buscas y le dices consultar.
El resultado de esta operacion regresará una lista de lo que buscas. Existe un link sobre esta lista que te permitirá descargar el listado completo.
Espero haberte ayudado.
si eso lo se, pregunte mal.
EliminarMi duda es si esta descarga la puedo automatizar?
La verda es que no tengo información del sii de como hacerlo o si existe un servicio que permita reliazarlo. Creo que no, pero desde el punto de vista programatico solo necesitarias poder realizar una referencia al link de la página de resultado utilizando un objeto request y bajar el resultado a tu maquina.
EliminarAsí que si la respuesta es positiva pero requiere desarrollo.
si en eso estaba... incluso trate de hacer el request a https://palena.sii.cl/cvc/dte/ee_empresas_dte.html simulando los head... me funciona siempre y cuando este en session en el sii. incluso trate de meter el token que tambien va y nada.
Eliminarseguire viendo..
Después de varias pruebas e intentos y muchas tazas de café, pude construir el libro correctamente ,firmarlo y enviarlo (a mano pero enviarlo), funcionando perfectamente según tus recomendaciones y especificaciones.
ResponderEliminarMuy agradecido por toda la información y tiempo
Estimado,
EliminarPodría contactarse conmigo por favor 62242459
Muchas gracias
Marcelo, hace poco nos hiciste una asesoría de la cual estamos muy agradecidos, gracias a ti pudimos enviar sin problemas los DTE y Libros al SII. Recomiendo al 100% tus asesorías, ya que la información sobre este tema es muy escasa y prácticamente todo es plataforma JAVA. Este blog permite a muchos seguir adelante con nuestros proyectos de facturación electrónica, te agradezco enormemente.
ResponderEliminarSaludos.
Buen material, me ha servido bastante se agradece.
ResponderEliminarPero tengo un problema con la firma, el dte lo firmo y luego vuelvo a firmar el set, lo subo a sii y me es rechazado por firma.
Alguna sugerencia o flujo que debo seguir, incluso cree una nueva rutina de firma con la documentación de microsoft y el resultado es el mismo.
Olvidenlo, era error entro teclado y la silla.
EliminarMe funciono perfecto.
Mauricio,
EliminarLamento no poder contestar rapidamente, el trabajo me tiene full.
Que bueno que solucionaste tu problema.
Estimado, Mauricio o Marcelo, cual fue la solución a su problema ya que tengo el mismo problema, logro firmar los 2 los cuales al comprobarlos por separados funcionan correctamente pero al juntarlos, da error de firma al subirlo al SII.
EliminarDe antemano muchas gracias!!
Saludos..
Marcelo,
ResponderEliminarEstamos enviando un archivo XML firmado al SII con respecto a la Cesión electrónica, el cual hemos validado schema y consumo correcto del servicio automático del SII, sin embargo arroja un error "Rechazado por Firma de Sobre". ¿A que se podrá referir con Firma de Sobre?
Carlos,
Eliminarbuenos días, mira lo primero es ver la posibilidad que me envies el documento para verlo y despues puedo comentarte que es lo que podría estar ocurriendo.
Dejame revisar los formatos de envio de las cesionespara saber si descubro algo.
Atte.
Marcelo Rojas R
Gracias Marcelo.... te envié un correo con el XML.
EliminarCarlos,
EliminarTengo el mismo error al generar la cesión electrónica. Favor puedes indicarme como solucionaste el problema ?
Gracias.
Gracias por compartir esto me ha funcionado bien....cuando envio al sii me da el siguiente error:
ResponderEliminar(TED-2-510) Firma Timbre Electronico Incorrecta
si pudieses guiarme donde tengo el error por favor??
Particularmente este error tiene relacion con el timbre del documento, para solucionarlo verifica que el CAF este bien insertado en el documento DTE. Te recomiendo que leas este articulo para que puedas insertar correctamente los datos del CAF. Recuerda que el caf debe ir insertado en el dte sin cambios ni arreglos. aunque se vea feo. No lo ordenes ni corrijas. eso solucionara el problema:
Eliminarhttp://lenguajedemaquinas.blogspot.com/2013/05/ejemplo-timbre-electronico-del-dte.html
Hola Marcelo, gracias por compartir esta información. Sabes, tengo un problema con respecto a la validación. Estoy en PHP y no logro detectar el problema. La firma de los DD con la private key está OK (de acuerdo al resultado de la doc y el tuyo), el mecanismo de firma con el archivo de certificado también (recupero token sin problemas), el tema es que al generar la firma de DTE y SETDTE si no le coloco la URI me indica "RPR - DTE Aceptado con Reparos (TED-2-510) Firma Timbre Electronico Incorrecta", pero si agrego la URI de acuerdo a los formatos definidos en documentación SII, me indica "RCH - DTE Rechazado (DTE-3-505) Firma DTE Incorrecta (Rechaza DTE)". El CAF lo incorporo obedientemente tal cual, extraigo de archivo, corto el trozo CAF y pego completito, sin tocar ni modificar. La razón social en el caf tiene acento..no se me ocurre qué más podría ser..alguna idea??? Como puedo validar por separado solo el DTE (y no el SETDTE). Gracias.
ResponderEliminarAclaro que antes de incorporar el CAF saqué todos los espacios como indicas y la carga del XML la realizo con preserveWhiteSpace = TRUE
EliminarResolví parte con respecto a la URI, pero sigo con Firma Incorrecta. Reviso los archivos con una herramienta y el trozo del CAF es exactamente igual... veo una diferencia en que el archivo CAF está codificado ANSI y el generado en "Western European (Windows)"... tendrá algo que ver?
EliminarEfectivamente debes cambiar la codificacion de recuperación por ISO-8859-1
Eliminarsolucionaste este tema??? yo no puedo, me da este error cuando en el documento hay caracteres con tildes o ñ
EliminarHola Marcelo, muy buen post y totalmente de mucha ayuda, te escribo porque estoy generando el documento y me entrega error "Rechazado por Error en Firma", quite todos los espacios de acuerdo a tus consejos y nada, hay algo que en me puedas orientar, por tu respuesta gracias.
ResponderEliminarpodrias llamamrme al 24042279
ResponderEliminarRecomiendo 100% los servicios de asistencia técnica de Marcelo, conoce muy bien el tema de facturación electrónica y además los problemas y posibles soluciones que van apareciendo, muchas gracias!!!!
ResponderEliminarEstimado, una consulta con respecto al armado de DTE en C#.
ResponderEliminarde donde se saca el TimeStamp que va en la etiquetas TmstFirmaEnv, TSTED , y TmstFirma ??
Estimado,
Eliminarlos valores de estos nodos deben ser insertados al momento de iniciar el firmado del documento. El fomato del nodo es yyyy-mm-ddThh:mm:ss. Recuerda que este valor debe ser calculado cuando se va a firmar el documento. No funcionara si calculas el valor hoy y firmas mañana.
Si lo estoy haciendo con un StringBuilder esta bien esto:
Eliminarsb.Append("xxxx");
sb.Append(""+DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")+"");
sb.Append("");
que raro no se publica el texto que va dentro de las llaves "<>" "" pero se entiende?
EliminarNo logro entender bien tu problema, si quieres puedes llamame al 24042279
Eliminarte puedo enviar un pantallazo a abaddon.1974@gmail.com?? o alguna otra parte??
ResponderEliminarMacelo
ResponderEliminarUtilizando PreserveWhiteSpace = true no ordena los nodos y se procede a la firma pero despues de firmar como vuelves a ordenar los nodos para subir el dte al sii ya que ellos piden es formato
Cesar,
EliminarLa verdad es que utilizando PreserveWhiteSpace = true el documento xml es abierto sin realizar ningun tipo de orden sobre los nodos. Al momento de firmarlo lo guardo tal como esta, sin modificaciones pues eso invalidaría la firma. Asi que despues de firmarlo no hago ningun orden sobre el documento y lo envío tal cual.
Macelo,
EliminarMe podrías ayudar cuando subo el archivo a SII, me arroja un error el la firma.
te puedo mandar el archivo?? para ver si encuentras algo?
de ante mano gracias
Saludos Marcelo.
ResponderEliminarJunto con agradecerte esta gran iniciativa que creo q a ayudado a muchos, sobretodos los que usamos C#.
Es que queria preguntar si tienes algunos tips el "SET de pruebas".
Por ejemplo:
- Que Rut se usa, en el XML del DTE, para el supuesto cliente.
- En la caratula del ENVIO_DTE que datos colocas en y
A modo de sugerencia seria genial si desarrollaras este punto en algun post.
Hola Marcelo, oye sabes me da un error de signature cuando intento enviar el dte, mi dte es este:
ResponderEliminarhttps://drive.google.com/file/d/0B3PT3OZNKSszN3ltcDBzVFFxQkk/edit?usp=sharing
lo extraño es q tengo todo ordenado hasta el momento de la firma, pero la firma se agrega en forma desordenada y es justo ahi donde me tira error. ¿que sera?
me dice:
Linea:104 The element type "Signature" must be terminated by the matching end-tag "</Signature>".
con status 7
en mi dte esta correctamente cerrado el signature, eso es lo extraño..
aqui puedes bajar en formato xml:
https://drive.google.com/file/d/0B3PT3OZNKSszLW9ZRFlIRWlpeUE/edit?usp=sharing
lo solucione, tuve que agregar la siguiente linea al final de la secuencia:
ResponderEliminarsecuencia.Append("--7d23e2a11301c4--\r\n");
esta es una linea de cierre q va despues de agregar envioDTE a la secuencia
Kataku, me sirvió tu solución, comparto las líneas original y solucionado:
EliminarOriginal:
secuencia.Append("\r");
secuencia.Append(xdocument.ToString(SaveOptions.DisableFormatting));
secuencia.Append("\r\n");
Solucionado:
secuencia.Append("\r");
secuencia.Append(xdocument.ToString(SaveOptions.DisableFormatting));
secuencia.Append("\r\n");
secuencia.Append("--7d23e2a11301c4--\r\n");
Gracias!! también me sirvió la solución :)
EliminarHola Kataku:
ResponderEliminarSe que esta pregunta no tiene nada que ver con lo que estás preguntando, pero me gustaría saber como hiciste para firmar, por separado, los nodos SetDoc y el F243096-1?? Yo tengo casi armado mi DTE y no he podido firmar los nodos por separado, a pesar de de haber proporcionado las referencias respectivas.
Como lo hiciste tu??
Revisé tu archivo y al compararlo con el archivo de ejemplo "F60T33-ejemplo.xml" se ve que está todo correcto.
Saludos,
DanielZ.
Este comentario ha sido eliminado por el autor.
ResponderEliminarCuando firmo me quedan las dos, por debajo de"/ SetDTE " y por sobre "/ EnvioDTE "
ResponderEliminarAlgo ocurre y algo estoy haciendo mal.
Gracias por algún consejo.
Hola Marcelo Rojas:
ResponderEliminarEn primer lugar, deseo expresar mis agradecimientos por la valiosa e interesante información de su blog, me ha sido de gran utilidad.
Lo segundo, tiene que ver unas consultas sobre el archivo EnvioDTE.xml, sobre el cual ya he logrado insertar :
Caratula, Encabezado, Detalles, CAF y el timbre, el cual se obtiene, como ya lo ha mencionado, al computar DD + La clave privada del CAF.
También he logrado firmar el archivo pero tengo dos consultas al respecto.
a. Entiendo que se debe firmar el nodo "EnvioDTE" y también el nodo interno DTE.
Hasta el momento he firmado el primer nodo (nodo raíz) y me faltaría el DTE.
¿Cómo lo hago? en la referencia coloco "F60T33" pero al ejecutarlo necesariamente, me firma el SetDTE.. algo estoy haciendo mal pero no se que puede ser.
Desde ya agradezco si fuese posible tu orientación al respecto.
De antemano gracias.
Hola,
ResponderEliminarRecibí del SII el mensaje: "RFR - Rechazado por Error en Firma"
Alguien sabe a qué firma se refiere? EnvioDTE, DTE, TED?
Gracias,
JC
Hola, tengo el mismo problema (en PHP) lograste solucionarlo?
EliminarYo lo solucione.
EliminarComo lo hiciste me puedes pasar un numero de contacto por favor.
EliminarIgual estoy interesado en saber como lo solucionaste. Ademas, ¿alguien sabe como saber a que firma se refiere?
EliminarEstoy con el mismo problema de la firma y les comento lo que he hecho hasta ahora:
ResponderEliminar- Al codificar a ISO-8859-1, sólo cambia el caracter '&' a '&', pero esto no me cambia las tildes.
- He intentado cambiar las tildes a mano, reemplazando 'á' por 'á' y tambien 'á' por 'á', pero la codificación ISO-8859-1 me vuelve a reemplazar el caracter '&' dejando 'á' y 'á'.
- También he quitado los acentos, reemplazo 'á' por 'a' y el servicio me lo acepta sin problemas, pero al declarar avance, me responde que el ítem que devería llevar acento, no es lo que se esperaba.
Gracias.
Solucionado,
EliminarLuego de hablar con Marcelo (gracias por tu disposición), me indica que en el método para generar la firma del timbre, hay que cambiar lo siguiente:
Antes:
ASCIIEncoding ByteConverter = new ASCIIEncoding();
Ahora:
Encoding ByteConverter = Encoding.GetEncoding("ISO-8859-1");
Esto, porque ASCIIEncoding no toma en cuenta las tildes.
referencia al método para generar la firma del timbre: http://lenguajedemaquinas.blogspot.com/2013/05/ejemplo-timbre-electronico-del-dte.html
Hola Marcelo,
ResponderEliminarEstoy desarrollando en PHP con Symfony2 la firma de los DTE. Avancé sin mayores problemas hasta el momento de enviar al SII el XML firmado. Envío el xml y siempre recibo "RFR - Rechazado por Error en Firma". He tratado de firmar de formas distintas el documento pero consigo el mismo resultado. Será que el xml necesita algún formato particular? todo a la izquierda? El digest de la firma se debe calcular de afuera hacia adentro, es decir, primero calculo el digest para el envío (SetDTE), luego el digest para cada documento (Documento)?
Actualmente para firmar lo que hago es usar las funciones de php para openssl y lo aplico en el orden: Documento (canonizado) -> firma -> SetDTE (canonizado) -> firma.
Si pudieras darme algun tips o ayuda con respecto al porque o a las posibles causas del error RFR te lo agradecería.
Saludos y gracias
¿Lograste solucionar este problema? yo no puedo, me es imposible. He intentado de mil formas, he revisado mil documentos y no lo logro. Gracias
EliminarGRACIAS MARCELO por tan maravilloso aporte...
ResponderEliminarDonde encuentro las instrucciones para llenar los 4 archivos de envio, tengo el DTE listo pero no puedo subirlo para evaluacion. Aprovecho de comentar que estoy desarrollando en VB6, si alguien puede colaborar o necesita ayuda, nos comunicamos por esta via.
Gracias a todos por participar de este interesante y buenisimo blog.
Este comentario ha sido eliminado por el autor.
ResponderEliminarTe cuento que estoy firmando ambos nodos, pero por alguna razón los dos nodos quedan juntos y al final y dentro del nodo EnvioDTE.¿Que puede ser?.. lo uso así:
ResponderEliminarSII.GenerarXML.firmarDocumentoXml(ref doc, cert, "#N150"); //
SII.GenerarXML.firmarDocumentoXml(ref doc, cert, "#SETDTE");
Eso pasa ya que firmas ambos nodos usando el mismo XmlDocument (la variable "doc" en este caso), para que eso no pase tienes que firmar el DTE en un XmlDocument separado, luego en otro XmlDocument (el del EnvioDTE) agregas el DTE que firmaste y finalmente firmas el xml del EnvioDTE.
Eliminara mi me pasa exactamente igual, aun cuando lo hago por separado, al firmar el DTE la firma se genera en el nodo EnvioDTE, luego guardo y abro en otro doc y la otra firma igual queda en la misma posición, aún cuando estoy pasando los uri correspondientes, es decir URI=#FXXXX y URI=#SetDoc.
Eliminar¿Alguien sabe como se soluciona esto?
hola como insertan el nodo CAF completo en el DTE justo despues de
ResponderEliminarcuando importo el nodo lo inserta dentro del usando InsertAfter() me sale ... datos del it o sea lo pone dentro del InnerText. Como lo hacen ustedes ??
Ya que esta página me ha ayudado bastante (GRACIAS!), hago mi pequeño aporte:
EliminarBueno lo que hago yo es que antes de firmar el DTE tengo el xml completo, con el nodo TED y el nodo CAF todo alineado a la izquierda, o sea el CAF lo agrego modificado.
Luego hago lo siguiente:
//tomo solo el nodo CAF del DTE
XmlNode nodoCAF = xmlDTE.SelectSingleNode("/DTE/Documento/TED/DD/CAF");
//reemplazo el nodo CAF con el original del SII
nodoCAF.InnerXml = xmlCAF.SelectSingleNode("/AUTORIZACION/CAF").InnerXml;
Donde xmlDTE es el xml del DTE completo y xmlCAF es el xml del archivo de folios (FoliosSII...) cargado con PreserveWhitespace = true.
Ojalá les sirva.
alguien sabe de (DTE-3-505) Firma DTE Incorrecta (Rechaza DTE)
ResponderEliminar-- gracias
solucionaste este problema???
EliminarRevisen los acentos y caracteres latinos, para no tener problemas pueden usar ISO-8859-1
Eliminarrecontraverificado aun no logro construir el set de pruebas por estos caracteres, necesito asesoría, ya llevo 2 semanas entrampado en esto y no logro dar con el error
Eliminaresteban.alarcon@telcom.cl
81390094
Problema solucionado, no era exactamente problema del encoding, sino que al firmar el SetDTE se volvían a recodificaban los caracteres acentuados provocando que el DTE sea distinto al firmado inicialmente. también ocurre al obtener el digest del timbre electrónico (FRMT)
EliminarEsteban Alarcón, Y cómo lo solucionaste, podrías ayudarnos con ese dato. Desde ya gracias.
EliminarHe revisado una y otra vez la firma del timbre, no hay tildes ni signos raros en el CAF, pero me sigue enviando error de firma en timbre. Al generar el timbre lo codifico en ISO-8859-1 pero aún así tengo el error.
EliminarMi pregunta es si al leer la clave privada también tengo que codificarla en ISO y el DD también?? que otra cosa más puedo revisar?
lo solucionaste? tengo el mismo problema
EliminarNO, aún sigo con el problema...
Eliminar¿Alguien puede darme una mano con esto?, ya no se que más hacer
Eliminaralguien sabe como constriuir un archivo de autorización de pruebas?
ResponderEliminarSaludos,
Me tira el siguiente error:
ResponderEliminar-------------------------------------------------------------------
Errores de Caratula
Doc. Informado No Corresponde a Contenido - TpoDTE: 33
------------------------------------------------------------------
He revisado la caratula una y otra vez y no e logrado identificar el problema
Alguien sabe como soluconarlo?? cualquier ayuda se agradece
PD: Excelente Blog me ayudo muucho en el tema de las firmas. Gracias :D
Mismo error y no doy con el problema
EliminarMarcelo, realmente te pasaste, gracias a tu asesoría, por fin pude resolver este tema que me tenia sin dormir...
ResponderEliminar(Altamente recomendable, muy humano e interesado en ayudar)
Un fuerte abrazo y queda pendiente ese asadito,
Gracias totales.
CHARLES.
Agradezco sus aportes, me han ayudado muchísimo!
ResponderEliminarMI consulta:
Los campos de tipo Base64 deben tener un máximo de 76 caracteres por línea lo cual no he podido cumplir ni para la firma del CAF ni para los datos del certificado (X509 Certificate). ¿A qué se puede deber este error?
Saludos!
Estimado,
EliminarTe recomiendo que no le des formato a estos campos dejalos tal cual, es decir para el lado. Es verdad que el SII te pide que sea con formato pero funciona correctamente si lo dejas para el lado.
Atte.
Marcelo Rojas Rojas
Estimado,
ResponderEliminarExiste algun modo de poder visualizar el DTE XML a PDF ?.
Saludos.
Estimado,
EliminarPuedes utilizar herramientas gratuitas como ITEXT sharp para generar tus documentos pdfs.
Muy bueno el post, nos ayudo mucho.
ResponderEliminarahora la pregunta es
¿Como se firma el SetDTE?
¿se hace de la misma forma?
se hace con ...?
yo lo hago con PHP
gracias de antemano
Muchas Gracias!!!!
ResponderEliminarRealmente todos los que visitan tu Blog, sacamos ideas de como debe hacerse!!!
Gracias
Felicitaciones Marcelo Rojas
ResponderEliminarQué útil ha resultado este post en contraposición con la escasa y dispersa 'ayuda' que brinda el SII, supuestamente el principal interesado en que esta simbiosis resulte.
Pero por otro lado, todos los que hemos leído estos foros, nos hemos dado cuenta que muchas preguntas acusan más dudas conceptuales (me incluyo) que de programación.
Por lo mismo, y para no abusar del altruismo del autor de este espacio, quiero proponer que se repita la idea de unas clases, (tal como una vez se hizo en el Café Los Gabrieles - Stgo Centro). Pero la diferencia es, que al final de éstas me comprometo a hacer un buen manual con ejercicios resueltos que podía titularse: “Resolviendo los acertijos del SII”, para subirlo gratuitamente a la red.
Las 4 ó 5 clases deberían ser principalmente CONCEPTUALES con un ejercicio ‘real’ resuelto al final de éstas, por c/u de los participantes. Para tal efecto, podría usarse la aplicación gratuita OpenSsl y XML Copy Editor
Por ejem, la primera clase podría ser:
a) - Certificado Digital
- Uso Llave Pública y Llave Privada. Verificación de firmas
- Generación Firma Electrónica (Formato SHA1+RSA) en Base64
- Generación Timbre Electrónico (Formato PDF417)
Y así hasta que al final del curso el alumno pueda generar un Dte válido y firmado, listo para ser enviado.
La idea está mucha más desarrollada, pero si hay interés lo conversamos.
Hola, primer que nada muchas gracias por la informacion. Ahora tengo un problema respecto a la firma digital. Puedo generar el digestValue sin problemas, sin embargo no puedo hacerlo con el SignatureValue. Estoy probando con un ejemplo y no me da el mismo valor. Para hacer esta firma tengo que entregar como parametro todo el SignedInfo? (
ResponderEliminar) asi lo estoy haciendo pero no me funciona.
Espero me puedan ayudar ya que slo me falta esto
Estimado Jaime puedes utilizar la siguiente rutina para poder firmar el documento completo de una vez.
Eliminarpublic static void firmarDocumentoXml(ref XmlDocument xmldocument, X509Certificate2 certificado, string referenciaUri)
{
// Create a SignedXml object.
SignedXml signedXml = new SignedXml(xmldocument);
// Add the key to the SignedXml document. 'key'
signedXml.SigningKey = certificado.PrivateKey;
// Get the signature object from the SignedXml object.
Signature XMLSignature = signedXml.Signature;
// Create a reference to be signed. Pass ""
// to specify that all of the current XML
// document should be signed.
Reference reference = new Reference();
reference.Uri = referenciaUri;
// Add the Reference object to the Signature object.
XMLSignature.SignedInfo.AddReference(reference);
// Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new RSAKeyValue((RSA)certificado.PrivateKey));
////
//// Agregar información del certificado x509
//// X509Certificate MSCert = X509Certificate.CreateFromCertFile(Certificate);
keyInfo.AddClause(new KeyInfoX509Data(certificado));
// Add the KeyInfo object to the Reference object.
XMLSignature.KeyInfo = keyInfo;
// Compute the signature.
signedXml.ComputeSignature();
// Get the XML representation of the signature and save
// it to an XmlElement object.
XmlElement xmlDigitalSignature = signedXml.GetXml();
///
/// inserte la firma en el DTE
xmldocument.DocumentElement.AppendChild(xmldocument.ImportNode(xmlDigitalSignature, true));
}
Hola Marcelo:
ResponderEliminarAgradezco tu valiosa labor de intentar de aclarar estos temas que lamentablemente no se han documentado adecuadamente.
Quisiera saber si me puedes contestar la siguiente pregunta que no he visto contestada en ninguna parte con claridad:
¿En qué hay que fijarse al firmar un libro de compras o ventas? ¿Se firma el libro completo o sólo el nodo EnvioLibro? ¿Se aplica solamente la firma final del archivo completo o se usa un folio y CAF como en las facturas?
Estoy hablando de ambiente de producción.
Agradecería inmensamente una pronta respuesta.
Se me olvidaba: Recibo del SII el mensaje "LRF - Envio de Libro Rechazado por Firma".
EliminarGracias de antemano.
Estimado, lamentablemente el tiempo es escaso y no he podido responder tan rapido como me gustaría. Mira lo que se firma es el nodo EnvioLibro. El error de la firma puede ser por varias razones favor especificar el metodo de como firmas los libros.
EliminarGracias
hola, una consulta, yo tengo el mismo problema, al enviar el libro de guias de despacho, el sii me arroja el error "LRF - Envio de Libro Rechazado por Firma", ¿hay alguna manera de detectar cual es el error de la firma usando la misma firma o el documento generado? saludos!
ResponderEliminarHola, estoy generando la firma con un certificado .pfx y me envía un error indicando lo siguiente:
ResponderEliminarExcepción no controlada del tipo 'System.Security.Cryptography.CryptographicException' en mscorlib.dll
Información adicional: La contraseña de red especificada no es válida.
¿a que se puede deber eso?
Solucionado, me faltaba indicarle el password del certificado
Eliminarhola estoy transformando mi sistema no tienes esta rutina en vb6 te lo agradecería ya que esto me esta provocando una ensalada que aun no entiendo , yo genero mis xml en vb6 y lo estamos utilizando con una empresa externa , todo ok pero queremos que estar trabajando en forma independiente ya que el soporte es pesimo ,
ResponderEliminarEstimado,
EliminarCuando pueda llamame al 224042279 para entender bien el problema
Alguien puede ayudarme con la firma del DTE ya que aparece bajo el nodo SetDTE, ¿como hago para que quede bajo el nodo Documento?
ResponderEliminarCuando pueda llamame al 224042279 para entender bien el problema
EliminarHola Marcelo, Excelente trabajo compartiendo y ayudando!
ResponderEliminarTengo una consulta ya que recibo el siguiente msj de respuesta por parte del SII:
XXXXXXXX-2
XXXXXXX-6
40983408
13/05/2016 12:24:17
RFR - Rechazado por Error en Firma
Según tu experiencia ¿cúal puede ser el error en la firma?
o cúal es el error más común que se comete al firmar?
Saludos y muchas gracias, quedo atento a tus comentarios!
S.O.S alguien puede darme una mano, estoy programando en VB.net y e provado varias soluciones sugeridas pero el mensaje siempre es el mismo (DTE-3-505) Firma DTE Incorrecta (Rechaza DTE) Ayudaaaa
ResponderEliminarFavor enviame el dte a abaddon.1974@gmail.com
EliminarEstimado Marcelo lamento profundamente molestarte, me hubiera gustado mucho resolver el problema personalmente pero se me acabaron las opciones y ya no tengo peras (estoy desesperado), he realizado el proceso completo desde la creacion del DTE hasta la firma, pero El SII me responde con el mensaje "RFR - Rechazado por Error en Firma" he alineado el doc a la izquierda tal como indicaste e insertado el CAF sin tocarlo y luego calculado el DD y creado el FRMT, me he preocupado de codificar correctamente el fichero, y lo firmo con la rutina que compartiste pero me sigue entregando ese implacable error, me podrias echar una mano
ResponderEliminarTengo el mismo problema, el documento está identico al original de SII, la verdad que llevo una semana y sigue dandome el mismo error. Lo único que me queda probar es cambiar el orden en que firmo.
EliminarIndiqueme alguien si estoy haciendo algo mal.
1) Genero el XML completo, EnvioDTE-SetDte-Caratula-Documento-Encabezado, etc (Completo).
2) En el proceso anterior genero la FRMT del TED.
3) Firmo el Documento
4) Firmo SetDte
Envío, el documento está identico al que SII da como ejemplo, pero me sigue arrojando "Rechazado Error en Firma".
Lo único que llegaré a probar es cambiar el orden en que se generan las firmas, ya no se me ocurre nada más.
Hola Hermann Pudiste solucionar el problema?, yo tengo el mismo problema pero no lo puedo solucionar.
EliminarHola Cristian, no la verdad que sigo teniendo el mismo problema. Ahora estamos cambiando la librería que firma, la que ocupa Nic.
EliminarHola Hermann, es probable que el error no esté en la firma sino en el envío. Me di de cabezazos como 4 semanas en la firma y finalmente no era eso. Lo que pasa es que la mensajería de SII es malísima. Prueba enviar el documento firmado no a través de tu software sino que a través del SW del SII.
EliminarSaludos
Alejandro
Estimado yo formateo cada datos de tipo texto
ResponderEliminarpublic static string mtdQuitarAcentosCaracteresNoUnicode(string strTexto)
{
string normalizedString = strTexto.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < normalizedString.Length; i++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(normalizedString[i]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(normalizedString[i]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
Hola primero gracias por tu bloq es de gran ayuda.
ResponderEliminarsi me puedes ayudar con esto
estoy tratando de realizar la firma de DTE ya esta la autentifican automatica
creo el xml
33
72300
2015-11-05
76155060-8
Agrocampo Negocios Agricolas Limitada
Fabricacion Y Com.De Implementos Agricolas-maquinaria Y Productos Agricolas ,ser
515009
San Miguel Sitio 16
Talca
Talca
76.658.280-K
Agricola Pobeña S.A
Agricola
85966257
Tucapel # 296, Ñuñoa
Ñuñoa
Ñuñoa
30000
0
19
5700
35700
1
INT1
Repuesto
1
30000
0
0
30000
1
D
Descto.
%
0
EFECTIVO
2015-11-05
luego segun lo que entendido debo agrear el CAF y la firma
este CAF tengo que pedirlo a Sii o puede ser cualquiera ?
y como firmo el DTE
esto tengo
Public Shared Sub firmarDocumentoXml_dos(ByRef xmldocument As XmlDocument, certificado As X509Certificate2, ByRef referenciaUri As String)
Try
Dim signedXml As New SignedXml(xmldocument)
signedXml.SigningKey = certificado.PrivateKey
Dim XMLSignature As Signature = signedXml.Signature
Dim reference As New Reference()
reference.Uri = referenciaUri
XMLSignature.SignedInfo.AddReference(reference)
Dim keyInfo As New KeyInfo()
keyInfo.AddClause(New RSAKeyValue(DirectCast(certificado.PrivateKey, RSA)))
keyInfo.AddClause(New KeyInfoX509Data(certificado))
XMLSignature.KeyInfo = keyInfo
signedXml.ComputeSignature()
Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
xmldocument.DocumentElement.AppendChild(xmldocument.ImportNode(xmlDigitalSignature, True))
Catch ex As Exception
Dim erro = ex.Message
End Try
End Sub
pero me sale este error: No se puede resolver el Uri http://schemas.xmlsoap.org/soap/envelope/.
agradeciera tu ayuda
gracias por todo jorquerajl@hotmail.com
Quiero expresar mis agradecimientos a Marcelo que gracias a su precisa asesoría pude por fín enviar y que me sean aceptadas las DTE.
ResponderEliminarTenías razón Marcelo en cuanto al tipo de letra al guardar el CAF en la base de datos, todo solucionado.
Mil gracias.
Alguien ha utilizado las nic labs estoy en la fase 4 y me da "Error Tecnico: TED - Firma invalida" alguien me puede ayudar.
ResponderEliminarEstimado primero que todo, muchas gracias por compartir tus conocimientos, realmente me ha sido de mucha ayuda, muchas gracias, lo otro es que tengo un problema cuando envió el documento firmado al SII me aparece "Rechazado por Error en Firma []", no se porque podría ser primero armo el DTE lo firmo,luego armo el EnvioDTE,incluyo el DTE y después firmo el SETDTE quizás estoy haciendo mal en el proceso? Gracias de antemano
ResponderEliminarRechazado por Error en Firma []: Significa que el sobre no esta firmado correctamente, es decir, existe un error cuando firmas el SetDTE, por lo general se debe a el xml se está firmando en UTF-8 y no en ISO-8859-1. Lo otro es revisar que al canonizar no se cambie la indetentación o se agreguen espacios versus el xml final que envías al SII. Recomendación firmar un xml sin acentos o caracteres extraños, luego que funcione agregar acentos para detectar donde está el problema.
EliminarMuchas gracias por tu ayuda Rodrigo, lo haré pero el caf contiene acento supongo que si se los elimino por codigo me invalidaria inmediatamente la firma no? ,tambien tengo una duda cuando armo el envioDTE, resulta que armo el nodo a partir de una variable string por ejemplo, string envio = "......" y luego agrego el DTE firmado al string ,luego convierto la codificacion y cargo todo al xmlDocument y firmo el nodo quizas esto estará afectando el xml? . Gracias de antemano
Eliminarpara poder utilizar estos caf con acentos, agregar al documento xml (CAF) la instruccion de procesamiento
Eliminar, esto hara que el compilador de c# pueda leer bien el caf
string envio = Nodo EnvioDTE + Nodo SetDTE + Nodo Caratula
EliminarGracias estimado, lo haré
EliminarEstimado aplique los cambios sugeridos, pero aún así me tira el mismo error, que otra cosa podría ser?
EliminarHola gracias por compartir tu código estimado te lo agradezco mucho ,también tengo un caf razón social con acento y lo transformo a "& # 211 ;"(Sin espacio) el carácter con acento pero automáticamente se transforma a "& amp ; # 211 ;"(Sin espacios) y al mandar el documento al SII me da error que el valor es muy largo como podría arreglar eso?
ResponderEliminarEstimado
Eliminarfavor enviar el documento caf para revisarlo y ver como podemos ayudarte
Estimado ya lo arregle, de todas formas gracias, ahora me tira error: (CAF-3-514) Firma del CAF incorrecta, eso significa que la firma de nodo CAF es incorrecta o la firma del nodo TED(ya que contiene el CAF) es la incorrecta?
EliminarTecnicamente significa que al CAF se le realizo una alteración.
EliminarBuenas, me sale este error cuando despliego mi apliacacion(Web Service) en ISS instalado en un servidor Windows 2012, pero en mi computadora persona en Visual Studio si lo corre con normalidad (el archivo del certificado *.pfx lo copie y si lo encuentra la aplicación al momento de correr en el servidor): System.Security.Cryptography.CryptographicException: El sistema no puede encontrar el archivo especificado. en System.Security.Cryptography.CryptographicException.
ResponderEliminarEstimado,
EliminarLo que ocurre es que cuando trabajas en tu pc personal el sistema operativo es capaz de leer tus certificados intalados en tu maquina, pero es una cosa distinta en un servidor. En el server no le da permisos a tu app para leer los certificados instalados en el servidor por un tema de seguridad. El objeto x509certificate tiene varias flags para solucionar esto. Tambien puedes serializar el certificadoen una campo varbinary de la base de datos SQL y leerlo desde alli. Claro que deberas guardar la clave del certificado para poder instanciarlo con el objeto x509certificate mas tarde.
Estimado, te cuento que estoy enviando al SII el set de pruebas de factura electrónica y me responde invariablemente con el mensaje "Rechazado por Error en Firma []".
ResponderEliminarEstoy desarrollando en VB6 y he probado el software mediante algunos XML enviados satisfactoriamente hace algunos meses atrás en el proceso de certificación de otra empresa. Pero solo logro emular la firma para DTE (con y sin tildes) y no para SETDTE. Probablemente se deba a un error en los datos que firmo precisamente para obtener el SETDTE.
He validado el esquema del XML generado mediante el validador online xmlvalidation.com
¿Alguna sugerencia? Ya son varias semanas que llevo entrampado en esta situación.
Marcelo: según tu experiencia, como puedo saber y solucionar el error de firma?
ResponderEliminargracias...
Pablo
Estimado Pablo
EliminarSegún mi experiencia debes tener presente lo siguiente:
- Verificar que al momento de generar el timbre del documento los caracteres esten codificados en ISO-8859-1 y no en ASCII
- El archivo CAF debe estar identico al que entrega el SII al momento de generar el timbre.
Con esto deberías pasar con el documento sin problemas
Marcelo: haber si entiendo
Eliminarel CAF entregado por SII no viene formateado
y al sumar el nodo CAF al XML del DTE, lo esta formateando.. esto no debe ocurrir?
Marcelo, puedo abusar de ti y enviarte el XML que estoy generando y el CAF entregado?
Eliminary decirme si esta correcta la generación?
tengo otro problema:
Eliminartengo firmado el DTE341075.xml, lo valido con el software XOLIDOSIGN e indica que esta correctamente firmado. No obstante, al importar este DTE al EnvioDTE.xml, firmar el EnvioDTE.xml, el mismo software me indica que la firma del DTE y la estructura de firma es incorrecta. Yo comparo los XML generados y son iguales...alguna sugerencia?
Alguien sabe por que no puedo descargar CAF en modo de certificación ??? me sale un mensaje que dice: no está autorizado para ingresar a esta opción. Y si ingreso con el R.U.T de empresa dice: Rut del Contribuyente ingresado no está autorizado para esta opción ya que es usuario del Portal Mipyme.
ResponderEliminarSaludos!!!
Amigos Una consulta. Estoy subiendo varios documentos al SII y queda rechazados por el siguiente motivo:
ResponderEliminarDetalle de Rechazos y Reparos de DTE
====================================
Folio Tipo Estado
------------------------------------------------------------------------------
139 33 RCH - DTE Rechazado
(CAF-3-514) Firma del CAF incorrecta
(TED-2-510) REPARO- Firma Timbre Electronico Incorrecta (Durante Abril de 2017, será cambiado a RECHAZO)
Desde ya muchas gracias.
Estimado, la rutina o como generas el objeto "X509Certificate2" como lo haces???? gracias cualquier orientación se te afradece!!!
ResponderEliminarEstimados, estoy tratando de desarrollar la cesión en java, tengo el envío del documento pero la generación del sector me está dando problemas ya que siempre me lo techada por error de schema si alguien me pudiera ayudar estaría muy agradecido
ResponderEliminarClaudio: tuve el mismo problema y al generar el XML el nodo EnvioDTE queda seguido de
ResponderEliminar"
<EnvioDTE...."
standalone="no"? EnvioDTE coloca un salto de línea entre ellos..así lo solucione yo
ResponderEliminartengo otro problema:
ResponderEliminartengo firmado el DTE341075.xml, lo valido con el software XOLIDOSIGN e indica que esta correctamente firmado. No obstante, al importar este DTE al EnvioDTE.xml, firmar el EnvioDTE.xml, el mismo software me indica que la firma del DTE y la estructura de firma es incorrecta. Yo comparo los XML generados y son iguales...alguna sugerencia?
estimados:
ResponderEliminaralguien sabe de que se trata el siguiente error CHR-00004: no se encontro envió(XML)?
como antecedente, el error me aparece cuando hago el envió del XML por UpLoad automático, en cambio cuando lo realizo en forma manual en el SII, me acepta el XML sin problemas..
gracias...
¿Como lo podría hacer para firmar más de un documento del SET?
ResponderEliminarEstimado,
EliminarPersonalmente para poder firmar 2 o mas dtes que estan en un set dte, extraigo los dtes y los firmo por separado, luego los inserto nuevamente en el set dte y firmo el set dte.
Espero que la información le ayude.
Estimado,
ResponderEliminarMuchísimas gracias Marcelo así lo estoy haciendo.
¿Estoy creando el Set de prueba no tendréis algún ejemplo de los diferentes tipos y de las notas de credito en xml?
Estimado Marcelo, primero agradecer tu blog me a sido de mucha ayuda, y segundo es saber si existe alguna forma de pasar ese codigo C# a php? desde ya muchas gracias
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola Marcelo, he leído el blog casi completo y es un gran aporte, desde ya te doy las gracias por dedicar tiempo a ayudarnos a todos a entender este mundo de la facturación con SII.
ResponderEliminarQuiero comentarte que yo decidí hacer todo con Spring y usando jdk8 (nada de apache) por lo que tuve varios problemas que fui solucionando, pero ahora tengo el problema de (DTE-3-505) Firma DTE Incorrecta (Rechaza DTE) y no he podido salir de ahí.
Si me pudieras dar algunas sugerencias seria genial.
Gracias desde ya.
Hola Marcelo:
ResponderEliminaren el ambiente de Certificación utilizó el RUT de SII (60803000-K).
Consulta:
en el ambiente de Producción, en la CARATULA, se ocupara el RUT de SII o el RUT del cliente, para luego hacer el UPLOAD.
gracias.
saludos...
Estimado Pablo,
EliminarTodos los envíos en ambiente de producción o certificación deben ir con el rut del SII. solo cuando envías el documento a tu cliente el rut debe ser el de tu cliente.
Atte.
Marcelo Rojas Rojas
Hola Marcelo:
ResponderEliminarlos datos de un contribuyente, se pueden obtener online?
por ejemplo: existe algún Webservices que extraiga esa información?
datos como el correo de intercambio registrado en el SII.
gracias...
saludos...
Estimado,
EliminarActualmente no existe un web services que permita descargar la lista completa de los contribuyentes o simplemente consultar uno para saber sus datos. Sin perjuicio de esto es posible recuperar la información utilizando programación.
Puedes revisar esta página para ver si es lo que necesitas.
https://lenguajedemaquinas.blogspot.com/2017/10/dll-recuperacion-lista-contribuyentes.html
Atte.
Marcelo Rojas Rojas
Buenas Tardes, Marcelo!
ResponderEliminarEspero te encuentres bien, mira aunque no programo o nunca he entrado al mundo en .NET ...se agradecen todos tus ejemplos porque me hago algunas ideas de como ir estructurando los archivos en el lenguaje que utilizo como PHP (-=
Y como estoy recién levantando a pulso un sistema ERP con modulos de facturación integrado....me queda mucho por hacer......uF!!!!
Quería consultarte de la mano...
Independiente del lenguaje q se este trabajando....estos mismos ¿deben crear el xml desde 0 para cada proceso...quiere decir:
- EnvioDTE (cabeceras, datos, firma ,etc)? Utilizando las librerías respectivas...?
O se toma un tipo de formato xml y en base a esa estructura se van añadiendo o llenando los tags de los mimmos xml.?
Y lo último........
Cuales serían las unicas formas de enviar los DTE's al SII
(previo obviamente haber creado los xml con sus firmas respectivas...)?
Ya que no es la idea que al terminar este mini erp con fact....los clientes solo creen las facturas...y despues tengan que ir a la pagina del sii....al formlario que estos ofrecen para subir (UPLOADED) los documentos.
EL uso de webservices del sii es obligación para el envio y recepción ? o solo es opcional?
Desde ya muchas gracias por tu orientación , gestión y profesionalismo.
Atte,
Wlaidmir
Uf, tienes varias preguntas.
EliminarOk veamos,
1.- Efectivamente debes generar los documentos xml desde cero,para ello puedes utilizar una plantilla xml, una clase que lo genere o incluso puedes generarlos a mano para tus pruebas, el documento xml solo es un documento de texto con formato y un encoding ("ISO-8859-1") especifico.
Posterior a esto debes comprobar que este bien construído utilizando el schema del sii. de esta forma sabras que tu documento no será rechazado por el SII.
Luego lo debes timbrar y posterior a esto firmarlo.
Luego lo ensobras en un nuevo documento xml denominado EnvioDte y lo firmas. En este momento estas listo para envarlo al SII utilizando los web services.
Con respecto a los web services, son obligatorios para todos los documentos que debas enviar al SII.
Uf Uf
Bueno eso sería, facil y bonito.
"Ahora bien, estos pasos parecen faciles, pero la practica te indicará todo un mundo de correcciones que se debe hacer para que los procesos fluyan correctamente"
Gracias por escribir.
Atte.
Marcelo Rojas Rojas
Uf, tienes varias preguntas.
ResponderEliminarOk veamos,
1.- Efectivamente debes generar los documentos xml desde cero,para ello puedes utilizar una plantilla xml, una clase que lo genere o incluso puedes generarlos a mano para tus pruebas, el documento xml solo es un documento de texto con formato y un encoding ("ISO-8859-1") especifico.
Posterior a esto debes comprobar que este bien construído utilizando el schema del sii. de esta forma sabras que tu documento no será rechazado por el SII.
Luego lo debes timbrar y posterior a esto firmarlo.
Luego lo ensobras en un nuevo documento xml denominado EnvioDte y lo firmas. En este momento estas listo para envarlo al SII utilizando los web services.
Con respecto a los web services, son obligatorios para todos los documentos que debas enviar al SII.
Uf Uf
Bueno eso sería, facil y bonito.
"Ahora bien, estos pasos parecen faciles, pero la practica te indicará todo un mundo de correcciones que se debe hacer para que los procesos fluyan correctamente"
Gracias por escribir.
Atte.
Marcelo Rojas Rojas
Perfecto, entendí y estoy mas claro aún Se agradece....
EliminarSolo 3 consultas...y no te molesto más (-;
1.- En el proceso de certificación....
Según algunas indicaciones de los manuales del mismo SII y algunos videos externos....y lo que tu mismo me afirmas....Entonces se deben enviar los casos del set de pruebas de los DTE's en un único archivo "SOBRE" de (EnvíoDTE) para el proceso de certificación? o normalmente aunque una vez certificado y quiero enviar solo un DTE a un cliente (independiente del tipoDOC) tiene que estar incluido o empaquetado en un nuevo doc xml como lo sería 1 EnvíoDTE ? aunque sea solo uno?
2.- Una vez creado el DTE o EnvíoDTE y quiero enviarlo....¿No existe ningún procedimiento manual (o formulario POST) en el sii para software de mercado para adjuntar y enviar mientras construyo el cliente de estos webservices ? o esta parte es mucho mas fácil de lo que parece? y es solo hacer un form con los campos necesarios para enviarlo?
Te pregunto en detalle ya que tu tienes las experiencia en estos procedimientos y aparte de ya tener tu software certificado obviamente....
3.- Y esta última consulta es:
Tengo una idea (proyecto) a corto plazo...con respecto a ofrecer una especie de gestión fácil servicio de boletas electrónicas a ciertos clientes...
¿También existe un proceso de certificación aparte para este tema de las boletas? o solo se certifica como un tipo de documento más?...
Muchas gracias nuevamente por tu Orientación, tiempo y gestión profesional.
Atte.
Wladimir.
????????? GRACIAS!
Eliminarbuenas marcelo tengo el siguiente inconveniente ya tengo el DTE.xml creado, firmado y demas. el problema que se me presenta es al momento del envio recibo la siguiente respuesta por parte de sii
ResponderEliminarCHR-00004: no se encontro envio(XML)
en el header de la peticion esta:
User-Agent: Mozilla/4.0
Cookie: TOKEN=vhjzdbfvjsd
Content-Type: multipart/form-data
en el body:
archivo:ejemplo.xml
rutSender: 09988776
dvSender: 3
rutCompany: 12223456
dvCompany: 4
ando sin salida a que la respuesta que me da el sii es que no estoy enviando el documento cosa que si lo estoy colocando en el body de la peticion
hola
Eliminartuve el mismo problema y lo solucione con dos cambios:
1.- el archivo XML de envió, en el xml version="1.0" encoding="ISO-8859-1" DEBE HABER UN SALTO DE LINEA EnvioDTE xmlns="http://www.sii.cl/SiiDte"
2.- el RUT del RECEPTOR DEBE SER el de SII
nada todavia hice esas dos modificaciones y me sigue arrojando el mismo error
Eliminarenvíame el XML para revisar...pnaviapohl@gmail.com
Eliminarbuenas tardes como estan, estoy tratando de firmar mi primer dte para el sii pero no he encontrado gormas muy claras de como hacerlo hasta el momento siempre recibo el siguiente error:
ResponderEliminar(ENV-3-0) Error en Schema - [0] LSX-00213: only 0 occurrences of particle "Signature", minimum is 1
no sabran a que se refiere esto?
gracias de antemano
Puedes enviarme el documento DTE, así lo reviso y te cuento
Eliminarabaddon.1974@gmail.com
Marcelo:
ResponderEliminarSera posible algunos TIPS para automatizar la descarga de CAF y empresas autorizadas (emisores/receptores) utilizando HTTP request con el método GET.
se que previamente me debo autenticar, pero trato de hacerlo con el certificado o con TOKEN y nada.
Por tu ayuda muchas gracias...
Pablo.
Estimado,
EliminarNo utilices el token generado por el medio de "Autenticación automática" debes tomar la página del sii donde se hace el login de usuario y generar desde allí el token. Es una tarea larga pero ese es el modo.
Marcelo:
Eliminarse obtiene ingresando usuario y clave o se le puede indicar el certificado?
Marcelo:
Eliminarhice el ingreso a la pagina del login del SII. Lo hice con RUT y CLAVE, pero la respuesta no es un XML para obtener el TOKEN.
como puedo usar el certificado?
da una respuesta al ingresar satisfactoriamente? de que tipo?
gracias...
envió un ejemplo de como hice el ingreso con RUT y CLAVE.
LET boundary = Security.RandomGenerator.CreateRandomString(15)
LET val="https://misiir.sii.cl/cgi_misii/siihome.cgi"
DISPLAY SFMT("Connecting to URL '%1' ...",val)
LET req = com.HTTPRequest.Create(val)
# Use POST
CALL req.setMethod("POST")
CALL req.setVersion("1.0")
# Zip content
CALL req.setHeader("Accept-Encoding","gzip, deflate")
CALL req.setHeader("User-Agent","Mozilla/4.0 (compatible; PROG 1.0; Windows NT 5.0; YComp 5.0.2.4)")
CALL req.setMultipartType("form-data",NULL,boundary)
LET val="CLAVE"
LET part = com.HTTPPart.CreateFromString(val)
CALL part.clearHeaders()
CALL part.setHeader("Content-Disposition",'form-data; name=\"clave\"')
CALL part.setHeader("Content-Type","text/xml")
CALL req.addPart(part)
LET val="9999999-0" --RUT
CALL req.removeHeader("Content-Type")
CALL req.setHeader("Content-Disposition",'form-data; name=\"rutcntr\"')
CALL req.doTextRequest(val)
# Process response
LET resp = req.getAsyncResponse()
IF resp.getStatusCode() == 200 THEN
DISPLAY "Done."
LET xTokenGlosa = resp.getTextResponse()
DISPLAY SFMT("Respuesta SII '%1' ...",xTokenGlosa)
Buenos días Marcelo, quería hacerte una consulta al enviar mi de me dale el siguiente error : RFR - Rechazado por Error en Firma, por casualidad no sabes cuál es la diferencia entre el campo digestvalue y signaturevalue?
ResponderEliminarGracias de antemano.
Saludos
hola Marcelo y si alguien sabe:
ResponderEliminarcual es el formato correcto del Reporte de consumo de folios (RCOF) de boletas electrónicas, cuando no se ha utilizado ninguno el periodo tributario?
caratula...
resumen (que datos y cuales en cero)
firma...
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola Marcelo, tengo una duda o un problema, realice el envio del Libros Contable Electronico y me lo rechazan por error llave publica, converse con el SII via correo y me dicen que modifican su software.
ResponderEliminarPasos basicos es:
1.Armo el XML
2.Tomo el CAL que tengo en la Base de Datos y lo concateno al XML
3.Estampo la Firma Electronica.
Lo que sucede es que el CAL toma la identacion del XML y hemos realizado varias pruebas y sigue sin poder tomar la forma que dice el SII.
La Forma en como tu explicas todo pegado hacia la Izquierda como se ve en una de tus explicaciones.
Estimada,
EliminarLo mas probable es que estes firmando en "caliente" el documento. Te recomiendo que una vez que agregues el nuevo nodo al documento lo guardes. Y posterior a esto lo abras para finalmente firmarlo.
Sí el problema persiste, puedes llamarme al 997800285
Atte,
Marcelo Rojas Rojas
Gracias Marcelo.
EliminarVoy a revisar con mi equipo y te comento.
Estimados:
ResponderEliminarRecurro a ustedes como último recurso. Resulta que al igual que un comentario anterior (de 2014, sin respuesta), me señala error de caratula. Por más que comparo y reviso el XML se encuentra idéntico al de prueba pero no logro dar con el problema.
El error en cuestión es:
Errores de Caratula
Doc. Informado No Corresponde a Contenido - TpoDTE: 33
Agradezco cualquier ayuda u orientación para solucionar esto.
Hola, yo tube ese error, la forma que encontré para solucionarlo fue generar y descargar un nuevo set de pruebas desde el ambiente de certificación y realizar nuevamente los pasos, ya me ha pasado un par de veces y creo que es un problema del SII, como que aveces el set de pruebas que se descarga no es el mismo que ellos guardan en el sistema
EliminarSaludos.
Muchas gracias por su ayuda. Realizaré lo que me indica.
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola Marcelo, estoy teniendo el ERROR DE VALOR DE FIRMA al parecer es por algo que se pierde al grabar el archivo XML, estoy utilizando xmlDocument para trabajar el archivo y al grabarlo lo hago con xmlDoc.save("c:\temp\miarchivo.xml") este me está generando algo extraño... Si pudieras compartir la forma que tienes para grabar el XML te lo agradeceria
ResponderEliminarMarcelo o el que pueda ayudar:
ResponderEliminarpor medio del correo de intercambio recibo XML's, que trato de validar la firma. hay XML que vienen con la firma 'Detached', el cual la remuevo para luego verificar la firma, pero de igual modo me indica firma invalida.
alguna sugerencia para validar la firma de documentos de proveedores?
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola Marcelo el ultimo comentario fue hace mas de un año, aqui en pandemia intengo ayudar a una empresa que tiene que informar Archivos XML para la OCDE al SII , algo que comenzo a partir de 2018, me pasaron el problema y aqui sufriendo por el soporte de SII
ResponderEliminarPregunta Cuando se firma un XML pasandole la referencias a la URI, la firma envuelve el TAG , SII entrega un formato que no he podido replicar con Programas para XML y menos con Codigo C#
Ellos dicen que tu XML
de la Forma
{?xml version="1.0" encoding="UTF-8" standalone="no"?}
{crs:CRS_OECD xmlns:cfc="urn:oecd:ties:commontypesfatcacrs:v1" xmlns:crs="urn:oecd:ties:crs:v1"
xmlns:ftc="urn:oecd:ties:fatca:v1" xmlns:iso="urn:oecd:ties:isocrstypes:v1"
xmlns:stf="urn:oecd:ties:stf:v4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" }
…
{/crs:CRS_OECD}
lo debes firmar asi de manera envolvente
{?xml version="1.0" encoding="UTF-8"?}
{Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId"}
{SignedInfo}
{CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /}
{SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /}
{Reference URI="#RefId-85a9a9d5503548908d2db12a9e8296de"}
{Transforms}
{Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /}
{/Transforms}
{DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /}
{DigestValue}...{/DigestValue}
{/Reference}
{/SignedInfo}
{SignatureValue}...{/SignatureValue}
{KeyInfo}
{X509Data}
{X509Certificate}...{/X509Certificate}
{/X509Data}
{/KeyInfo}
{Object Id="RefId-85a9a9d5503548908d2db12a9e8296de"}
{crs:CRS_OECD xmlns:cfc="urn:oecd:ties:commontypesfatcacrs:v1" xmlns:crs="urn:oecd:ties:crs:v1"
xmlns:ftc="urn:oecd:ties:fatca:v1" xmlns:iso="urn:oecd:ties:isocrstypes:v1"
xmlns:stf="urn:oecd:ties:stf:v4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" }
…
{/crs:CRS_OECD}
{/Object}
{/Signature}
pero lo que termina pasando cuando lo intentas firmar con el codigo C# clasico , no envuelve el XML sino que adjunta o pone al final del archivo la firma justo antes del cierre de tu "tag" o el "element" que quieres firmar. En el ejemplo de ellos es Object.
Gracias !
Firmar XML-CRS-OCDE...
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola Marcelo.
ResponderEliminarTengo tu aplicación para firmar DTE y funcionaba pefecto, pero ahora tengo un problema al querer firmar documentos.
El problema se da en la función "DecodeRSAPrivateKey", al momento de hacer el "importParameters" de los RSAParameters se cae e indica: Datos incorrectos.
¿Sabes a qué se deba esto? Antes funcionaba perfecto la aplicación.
Quedo atento.
Saludos.-
Hola Marcelo.
ResponderEliminarmuchas gracias por toda esta información de valor, quisiera hacer una pequeña pregunta respecto al certificado que se usa para la firma, es el mismo certificado que se usa para acceder al SII Chile, o debe ser otro que tenga la configuración de algoritmo hash de firma Sha1.
Estimado,
EliminarEl certificado debe ser para factura electrónica y este te sirve para firmar tus documentos dtes y también para acceder al SII
Hola
ResponderEliminarTengo problemas con un CAF con letra Ñ, respuesta del sii
"Firma del CAF incorrecta"
para aquellos que tienen el problema '(ENV-3-0) Error en Schema - CHR-00002: Line too long (4090)' les recomiendo que creen sus documentos dtes con indentación para evitar el largo máximo de la cadena que reclama el SII. Este es solo un error de formato. Técnicamente los servidores pueden leer un documento XML sin los retornos de carro, pero el SII solicita que este documento este indentado.
ResponderEliminarNota: Este problema no necesariamente tiene relación con la firma electrónica y su formato.
Cosa curiosa es: llamé al SII para consultar por el código del error 'CHR-00002: Line too long (4090)' y luego de algunos me indicaron que pasarían al segundo nivel del SII para responder mi consulta. Después me colgaron.
Y como se indenta ??
EliminarMi codigo:
Asi formateo firma; donde formateaXML corta firma en lineas de 76 caracteres.
Dim fic As String
fic = DirPath + "\XML\" + Archivo_XML + ".xml"
Dim sw As New System.IO.StreamWriter(fic, False, Encoding.GetEncoding("ISO-8859-1"))
texto = texto + FormateaXML(sig_DTE.OuterXml)
texto = texto + ""
sw.WriteLine(texto)
sw.Close()
Public Shared Function FormateaXML(ByVal xml As String) As String
Dim it As String = ""
Dim i As Integer
Dim loXElement As New XmlDocument
Dim texto As String
For i = 1 To Len(xml)
Dim p1 As Integer = InStr(i, xml, "")
If p1 > 0 Then
Dim p2 As Integer = InStr(p1 + 1, xml, "")
If p2 > 0 Then
texto = Mid(xml, p1 + 16, p2 - p1 - 16)
texto = Corta_76(texto)
it = it + Mid(xml, 1, p1 - 1) + "" + texto + ""
xml = Mid(xml, p2 + 17, Len(xml))
End If
End If
Dim p5 As Integer = InStr(i, xml, "")
If p5 > 0 Then
Dim p6 As Integer = InStr(p5 + 1, xml, "")
If p6 > 0 Then
texto = Mid(xml, p5 + 9, p6 - p5 - 9)
texto = Corta_76(texto)
it = it + Mid(xml, 1, p5 - 1) + "" + texto + ""
xml = Mid(xml, p6 + 10, Len(xml))
End If
End If
Dim p3 As Integer = InStr(i, xml, "")
If p3 > 0 Then
Dim p4 As Integer = InStr(p3 + 1, xml, "")
If p4 > 0 Then
texto = Mid(xml, p3 + 17, p4 - p3 - 17)
texto = Corta_76(texto)
it = it + Mid(xml, 1, p3 - 1) + "" + texto + ""
xml = Mid(xml, p4 + 18, Len(xml))
End If
End If
Next
FormateaXML = it + xml
End Function
Public Shared Function Corta_76(ByVal Valor As String) As String
Dim Firma As String = ""
Dim i As Integer = 1
Do While Len(Valor) > 76
Firma = Firma + Mid(Valor, 1, 76) + vbCrLf
Valor = Mid(Valor, 77, Len(Valor))
Loop
Firma = Firma + Valor
Return Firma
End Function
Asi lo resolvi.... incluyendo saltos de linea en XML usando vbCrLf !!
EliminarStr_Doc = Str_Doc + "" + vbcrlf
Str_Doc = Str_Doc + "" + CStr(j) + "" + vbcrlf
If DTE_Det(j).Codigo_Producto > "" Then
Str_Doc = Str_Doc + "" + vbcrlf
Str_Doc = Str_Doc + "INTERNO" + vbcrlf
Str_Doc = Str_Doc + "" + DTE_Det(j).Codigo_Producto + "" + vbcrlf
Str_Doc = Str_Doc + "" + vbcrlf
End If
If DTE_Enc.Tipo_Documento <> "34" Then
If CDec(DTE_Det(j).Exento_Producto) <> 0 Then
Str_Doc = Str_Doc + "" + DTE_Det(j).Exento_Producto + "" + vbcrlf
End If
End If
"INTERNO" + VbCrLf
EliminarAl final de cada Tag XML
Este comentario ha sido eliminado por el autor.
EliminarHola, muy interesante lo que comentan y tengo el mismo error en mi software :( , queria saber si el error está en la firma (que se debe de cortar ) o es todo el documento XML.
EliminarQuedo atento, saludos.
Lo acabamos de solucionar, teníamos el mismo mensaje (ENV-3-0) Error en Schema - CHR-00002: Line too long (4090) . en una línea del documento digitaron el signo +
ResponderEliminaren que parte colocaron el signo + ? saludos
EliminarHola buenas tardes, en que parte del XML colocaron el signo + saludos
ResponderEliminarHola buenas dias, genero bien el FRMT, pero tengo el siguiente error al firmar el DTE "RFR rechazado por Error en Firma", estoy trabajando en lenguaje php. Necesito ayuda por favor.
ResponderEliminarEstimado, es muy probable que el archivo caf que estas insertando en el documento DTE no se a el mismo que bajas del SII, Verifica que el documento sea el mismo, con la misma estructura, pues cuando lo ordenas o le agregas retornos de carro, se invalida. También es posible que tu caf tenga del origen tildes en el nombre de la empresa. Sí necesitas más ayuda avísame.
EliminarUna duda, si formateo el xml para tenerlo todo ordenado, sin pegarlo todo hacia la izquierda, la firma deberia quedar bien tambien? pregunto porque cuando firmamos la semilla, no identamos todo hacia la izquierda y lo firmamos asi tal cual
ResponderEliminarHola. Como ya se ha comentado en otras respuestas si se altera (aplicandole espacios o saltos de linea) cualquier parte del CAF (entregado por el SII) se invalida la firma. Si se altera cualquier contenido de algún DigestValue también. No te preocupes de dejarlo "ordenado"
Eliminarotra duda es que al firmarlo, lo envias asi tal cual? no le colocas la caratula y lo vuelves a firmar?
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminar