¿Qué es el sello?
El sello es el resultado de la firma de la cadena original del CFDI en base64, tiene como propósito emitir comprobantes, acreditar al creador, autenticar y dar integridad al mismo.
Para poder generar el sello es necesaria la cadena original del comprobante a sellar, así como los certificados de sello digital (*.cer y *.key).
Para poder generar el sello es necesario contar con los siguientes elementos:
- Cadena Original del XML a sellar
- Certificado de Sello Digital en formato PEM y su correspondiente llave privada también en formato PEM.
- Algoritmos de criptografía para la generación de la Digestión o Hash.
- Utilerías o funciones de criptografía (por ej. OpenSSL)
¿Qué es la cadena original?
Se entiende como cadena original a la secuencia de datos formada con la información contenida dentro del comprobante, está bajo la norma del estándar Anexo 20.
- Al inicio y al finalizar la cadena original se encuentra marcado mediante una secuencia de caracteres || (doble pleca).
- Se debe de expresar únicamente la información del dato sin expresar el atributo al que hace referencia. Es decir, si el valor de un campo es “A” y el nombre del campo es “Concepto”, sólo se expresa |A| y nunca |Concepto A|.
- Cada dato individual se debe separar de su dato subsiguiente, en caso de existir, mediante un carácter | (pleca sencilla).
- Los espacios en blanco que se presenten dentro de la cadena original son tratados de la siguiente manera:
- Se deben de reemplazar todos los tabuladores, retornos de carro y saltos de línea por el carácter espacio (ASCII 32).
- Acto seguido se elimina cualquier espacio al principio y al final de cada separador | (pleca).
- Finalmente, toda secuencia de caracteres en blanco se sustituye por un único carácter espacio (ASCII 32).
- Los datos opcionales no expresados, no aparecen en la cadena original y no tienen delimitador alguno.
- Toda la cadena original se expresa en el formato de codificación UTF-8.
- El nodo o nodos adicionales se integra a la cadena original como se indica en la secuencia de formación en su numeral 10, respetando la secuencia de formación y número de orden del Complemento:Concepto.
- El nodo o nodos adicionales se integra al final de la cadena original respetando la secuencia de la formación para cada complemento y número de orden del Complemento
¿Cómo generar la cadena original para CFDI 4.0?
Para poder extraer la cadena original de un XML (CFDI) es necesario hacer uso de un lenguaje de transformación de documentos como lo es el XSLT, en este caso nos permite obtener/trasnsformar la información contenida en el XML a una cadena de texto, con la secuencia de datos y lineamientos que la plantilla de Secuencia de CadenaOriginal (XSLT) del SAT especifica.
Secuencia de Cadena Original (XSLT) http://www.sat.gob.mx/sitio_internet/cfd/4/cadenaoriginal_4_0/cadenaoriginal_4_0.xslt
Los elementos que debemos de considerar para la extracción de la cadena original son los siguientes:
- XML del CFDI a sellar
- Secuencia de Cadena Original (XSLT)
- XSLT Test Tool (Herramienta para poder extraer la cadena original)
Para poder utilizar la herramienta XSLT, solo es necesario copiar y pegar el contenido del XML, en el recuadro donde lo indique y en el segundo cuadro se estará agregando el contenido del XSLT es decir secuencia de la cadena original.
El resultado de la extracción de la cadena original quedaría de la siguiente manera, el cual estaremos guardando en un archivo, en este paso para efecto del ejemplo le pondremos como nombre “cadena_original.txt”:
||4.0|MX|63893|2023-02-22T11:42:38|30001000000400002434|0|XXX|0|P|01|21090|EKU9003173C9|ESCUELA KEMPER URGATE|601|MICV9209288D2|VIANEY OMARA MIRANDA CASTRO|83556|612|CP01|84111506|1|ACT|Pago|0|0|01|2.0|13072.82|1045.83|94794.07|0.00|109086.61|2023-02-20T12:00:00|03|MXN|1|109086.61|63893|BMN930209927|0113054288|ACF0BEF4-4509-46CC-99EB-4C8F71C20B40|ML|265419|MXN|1|2|109086.61|109086.61|0.00|02|161.086413|003|Tasa|0.080000|12.886913|13072.820532|002|Tasa|0.080000|1045.825643|94794.069918|002|Tasa|0.000000|0.000000|13072.820532|002|Tasa|0.080000|1045.825643|94794.069918|002|Tasa|0.000000|0.000000|161.086413|003|Tasa|0.080000|12.886913||
¿Cómo generar el sello para CFDI 4.0?
Para la generación del sello digital de los comprobantes CFDI’s tal como lo especifica el Anexo 20 en el inciso I Sección B es necesario utilizar alguno de los siguientes algoritmos:
- SHA-2 o SHA-256, para el sellado del Comprobante Fiscal Digital a través de Internet.
A continuación, mostraremos una serie de pasos a seguir para poder obtener la digestión, utilizando los comandos de OpenSSL.
Paso 1.- Convertir el certificado en formato PEM.
openssl x509 -in "CSD_Escuela_Kemper_Urgate_EKU9003173C9_20190617_131753s.cer" -inform DER -out "EKU9003173C9.cer.pem" -outform PEM
Paso 2.- Convertir la llave privada en formato PEM.
openssl pkcs8 -inform DER -in "CSD_Escuela_Kemper_Urgate_EKU9003173C9_20190617_131753.key" -passin pass:12345678a -out "EKU9003173C9.key.pem
Paso 3.- Generar la Digestión haciendo uso de la cadena original previamente guardada.
openssl dgst -sha256 -sign "EKU9003173C9.key.pem" -out "digest.txt" "cadena_original.txt"
Paso 4.- Generamos el sello digital.
openssl enc -in "digest.txt" -out "sello.txt" -base64 -A -K "EKU9003173C9.key.pem"
Ejemplo de un sello generado.
Gk78oNHtr+vQ8/VB1wqU8EYkch5VPqv5AVZ2Rgx4Zmff1sQLKye/qRVzaxxZlKyFjTZca/TgZfpUBfRAZ959enRm5d/nnfHupiHdVNBv8vF1UfXRZzaxo7YdtVAYByqErKeefFBCbAO716zgbRZSDpyWRaiQgV6/hwSADizNpA8cUVBV3gXyRQ9fwMJy2FZzbYVsrgm7X38ogtGlfPnVW1qYS7Wbpm4Stz1YUZ4kpZu/TS/kMCmgg4UTAmyzs4bfRnZrDeVZmKVClEtWgwmDnPGDyoDV+sqCTrUS6hmOKa5mmvGBfmFdK6zzPRaKACzRplXONuQGMfXz1egNUcTjJQ==
? Artículos de apoyo:
En SW® somos mejores para TI, es por ello que tu opinión es muy importante, por favor ayúdanos calificando este articulo y dejando tus comentarios.