Llama Gratis 01800 788 0195

Generar sello

¿Qué se necesita para generar el sello?

 

Para poder generar el sello es necesario contar con los siguientes archivos:

 

  • Cadena Original.
  • Certificado de Sello Digital convertido a PEM.
  • Digestión o hash.

¿Qué es la cadena original?

 

Se entiende como cadena original, a la secuencia de datos formada con la información contenida dentro del comprobante fiscal digital por internet, establecida en el Rubro I.A. del Anexo 20 Estándar.

Es importante mencionar que la secuencia de formación siempre se registra en el órdenes que se expresa en el apartado correspondiente a cada uno de los comprobantes fiscales, complementos y del timbre fiscal digital del SAT, tomando en cuenta las reglas generales que se muestran a continuación:

 

Reglas generales para generar la cadena original

 

  • 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 tabulares, 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 <ComplementoConcepto> 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 ComplementoConcepto.
  • El nodo o nodos adicionales <Complemento> 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 poder extraer la cadena original es procesando el comprobante fiscal digital en formato XML con las plantillas de Secuencia de Cadena Original (XSLT)

Los elementos que debemos de considerar para la extracción de la cadena original son los siguientes:

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.

Es importante mencionar que la cadena original se debe de extraer la misma cantidad de veces que dicho comprobante de CFDI sufra algún cambio.

El resultado de la extracción de la cadena original es el siguiente, el cual estaremos guardando en un archivo, en este paso para efecto del ejemplo le pondremos como nombre “Cadena_original.txt”:

||3.3|2018-11-27T12:37:40|01|30001000000300023708|6260.00|MXN|1|7261.60|I|PUE|06300|AAA010101AAA|SENTIENT SA DE CV|601|IAD121214B34|IT SW Development Solutions de Mexico S de RL de CV|P01|10122100|6|M74|Kilo|prueba Catalogos Nuevos|1000.00|6000.00|6000.00|002|Tasa|0.160000|960.00|24111500|1|KGM|kg|traslucida 90x90 cm. cal. 200|22.00|22.00|22.00|002|Tasa|0.160000|3.52|13101712|10|KGM|KG|POLIETILENO DE BAJA DENSIDAD|23.80|238.00|238.00|002|Tasa|0.160000|38.08|002|Tasa|0.160000|1001.60|1001.60||

 

¿Que es el sello?

 

El propósito del sello es emitir comprobantes y acreditar al creador del comprobante fiscal digital con autenticidad, integridad, verificables y no repudiables por el emisor. Para poder generar el sello es necesario tener el resultado de la cadena original que es obtenido del xml del comprobante a sellar, también es necesario los certificados de sello digital (.cer y .key) convertidos a “pem”. El sello contiene la información del emisor e información del comprobante codificada, que si dicho comprobante por algún motivo sufre cambio y no se vuelve a generar un sello nuevo, nos arrojará error al tratar de timbrarlo.

¿Cómo generar el sello?

 

Para la generación del sello digital para los comprobantes CFDI’s tal como lo específica el anexo 20 en el inciso I Sección B. Los algoritmos que utilizaremos para la generación del sello digital es el siguiente:

Sha-256: Que es una función haash de un solo sentido tal como cualquier entrada produce una salida compleja de 256 bits (32 bytes) denominada digestion.

A continuación les mostraremos una serie de pasos que necesitamos hacer primero para poder obtener la digestion, utilizando los comandos de OPENSSL.

 

  1. Obtener el PEM del certificado y el contenido sin los encabezados agregarlo en el atributo Certificado en el XML
    openssl x509 -in 'CSD01_AAA010101AAA.cer' -inform DER -out 'CSD01_AAA010101AAA.cer.pem' -outform PEM
  2. En el siguiente ejemplo se puede ver como quedaría el certificado una vez convertida a extensión .PEM.

    -----BEGIN CERTIFICATE-----
    MIIF+TCCA+GgAwIBAgIUMzAwMDEwMDAwMDAzMDAwMjM3MDgwDQYJKoZIhvcNAQEL
    BQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UE
    CgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNV
    BAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNp
    w7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEm
    MCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEM
    BTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDES
    MBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkq
    hkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNzA1MTgwMzU0NTZaFw0y
    MTA1MTgwMzU0NTZaMIHlMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVT
    QVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFM
    RVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFND
    MSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQF
    ExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxGzAZBgNVBAsUEkNTRDAxX0FBQTAxMDEw
    MUFBQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJdUcsHIEIgwivvA
    antGnYVIO3+7yTdD1tkKopbL+tKSjRFo1ErPdGJxP3gxT5O+ACIDQXN+HS9uMWDY
    naURalSIF9COFCdh/OH2Pn+UmkN4culr2DanKztVIO8idXM6c9aHn5hOo7hDxXMC
    3uOuGV3FS4ObkxTV+9NsvOAV2lMe27SHrSB0DhuLurUbZwXm+/r4dtz3b2uLgBc+
    Diy95PG+MIu7oNKM89aBNGcjTJw+9k+WzJiPd3ZpQgIedYBD+8QWxlYCgxhnta3k
    9ylgXKYXCYk0k0qauvBJ1jSRVf5BjjIUbOstaQp59nkgHh45c9gnwJRV618NW0fM
    eDzuKR0CAwEAAaMdMBswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwDQYJKoZI
    hvcNAQELBQADggIBABKj0DCNL1lh44y+OcWFrT2icnKF7WySOVihx0oR+HPrWKBM
    Xxo9KtrodnB1tgIx8f+Xjqyphhbw+juDSeDrb99PhC4+E6JeXOkdQcJt50Kyodl9
    URpCVWNWjUb3F/ypa8oTcff/eMftQZT7MQ1Lqht+xm3QhVoxTIASce0jjsnBTGD2
    JQ4uT3oCem8bmoMXV/fk9aJ3v0+ZIL42MpY4POGUa/iTaawklKRAL1Xj9IdIR06R
    K68RS6xrGk6jwbDTEKxJpmZ3SPLtlsmPUTO1kraTPIo9FCmU/zZkWGpd8ZEAAFw+
    ZfI+bdXBfvdDwaM2iMGTQZTTEgU5KKTIvkAnHo9O45SqSJwqV9NLfPAxCo5eRR2O
    Gibd9jhHe81zUsp5GdE1mZiSqJU82H3cu6BiE+D3YbZeZnjrNSxBgKTIf8w+KNYP
    M4aWnuUMl0mLgtOxTUXi9MKnUccq3GZLA7bx7Zn211yPRqEjSAqybUMVIOho6aqz
    kfc3WLZ6LnGU+hyHuZUfPwbnClb7oFFz1PlvGOpNDsUb0qP42QCGBiTUseGugAzq
    OP6EYpVPC73gFourmdBQgfayaEvi3xjNanFkPlW1XEYNrYJB4yNjphFrvWwTY86v
    L2o8gZN0Utmc5fnoBTfM9r2zVKmEi6FUeJ1iaDaVNv47te9iS1ai4V4vBY8r
    -----END CERTIFICATE-----

     

  3. Obtener el PEM de la llave, con el cual se realizará la firma digital de la cadena original.

    openssl pkcs8 -inform DER -in 'CSD01_AAA010101AAA.key' -passin pass:12345678a -out 'CSD01_AAA010101AAA.key.pem'
    
  4. En el siguiente ejemplo se puede ver como quedaría la lleve una vez convertida a extensión .PEM

    -----BEGIN PRIVATE KEY-----
    MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCXVHLByBCIMIr7
    wGp7Rp2FSDt/u8k3Q9bZCqKWy/rSko0RaNRKz3RicT94MU+TvgAiA0Fzfh0vbjFg
    2J2lEWpUiBfQjhQnYfzh9j5/lJpDeHLpa9g2pys7VSDvInVzOnPWh5+YTqO4Q8Vz
    At7jrhldxUuDm5MU1fvTbLzgFdpTHtu0h60gdA4bi7q1G2cF5vv6+Hbc929ri4AX
    Pg4sveTxvjCLu6DSjPPWgTRnI0ycPvZPlsyYj3d2aUICHnWAQ/vEFsZWAoMYZ7Wt
    5PcpYFymFwmJNJNKmrrwSdY0kVX+QY4yFGzrLWkKefZ5IB4eOXPYJ8CUVetfDVtH
    zHg87ikdAgMBAAECggEALS8Z1KJXzVIxLVoWcRh0kAcxPMJlIgsvaz6xrTTaf2Ui
    mcAjIvMuXPZTbR/MEuD4SS+Pq1xMeoz8UV5cM50vkm3QLoU9n0SyrQVJQ+6q4Npl
    9SwuMqNXVS/l1YEEcJNTYwq7rE5OtAYIPn7s7i5dhJIUKgeZsu7xcf9VpdLgjVCD
    qGgJw/EfhagR7iPF+PKoeyRyBZI9xuHmtElHVgn2/Qv/16UJv0YpAqRgVq7YQzZC
    c7yo0Y2+3dqHabRg+MnIKkN4pBFBzYxsjwM7YUDk/8zFlF5kwCS74ep0JWWSYAJ1
    3DYDtCYSyWk1DvxX9Srv/S2htZM6MnhboafjLch4QQKBgQDRGGLpYdqGt6/cXKQe
    JGWFrG33AMiYKrd4NOw7LK7kzrQESeaeAXSwr2eOnNV3tDMyslkjpC05m3Lbefsh
    Ul6Qj/Qj9PEIpv7e4X4r++O/FsA9X6iQFicMEDzRYYjm4AfFggYrhzmjXh2rNACL
    KRX5i9wIRGQuoAG7KuZyYWSBuwKBgQC5Rsv75S6FNUpKe8RC2nw13Vaf9uua2W1+
    spg2pWfKqw88vvFATQOj9A9aFJ+wqrvwRziua5xtbch9gHK7M9Nnl565Tk8muueO
    OUBaFeHYXsDaYZfTFILOZU4/b6//r6QK2cO892VXyUydbRXavCpRX8s2EoxtwfFG
    mgbStX+HBwKBgQCICHKJXXU7QhPyrH7FcW5vKgAcu3DFtrzIQr4RvX9HMsdhJucX
    kuDk9ijMWnJyv1Szvd5KVsxpdx2hdlmQkzMcn9r47alGtMaKIG/ik6zWrCmDhFF4
    9ECRE5tNqUPU2JmVwILdHMu94kQxFtLntmIqiPgslLoMr2KQ71cfwQcPcwKBgQCk
    iNKtqCFf+qs26iKonA6iZyV+eXFR2rT6RvAV114NBUxKzebBC6On/h2ECbymz3iH
    MTiM7NPF+jCKA3/f725WGLfEKF7yLhlknEMhvT0LQVpSlUiXEyf20tBiVXUew4QS
    fsDtF2bQRtvbEfzOezu5eDCmnGJJNmpmIHLevH+8EQKBgF9Ff09RISQJHbABka8f
    wj8sdBKWG3TUQ2SwQ9U3L/Y/unuyaRUF+J3wFRYBMQGu0jzLG5TFfAVZAc3VJCBj
    xG6K8WnJS6OM9ycV0qBa2WnkC7M7uAt4K9IEIqlOljY/R2tBN7qHZwE7nCLS88rv
    L5YWIiKp71SlXyoGLfM0h7bl
    -----END PRIVATE KEY-----

     

  5. Generar la digestión o hash
    openssl dgst -sha256 -sign 'CSD01_AAA010101AAA.key.pem' -out 'digest.txt' 'cadena_original.txt'
    
  6. Creación del archivo PEM de la llave privada
    openssl enc -in 'digest.txt' -out 'sello.txt' -base64 -A -K 'CSD01_AAA010101AAA.key.pem'
  7. El archivo llamado sello.txt contendrá el sello generado como se muestra a continuación.
    Vve+KIMdhPjSiPoA+oFPOI1+DHhbIZpAfjHDjdvuDpN9ga4g76DS90JDlY1mwXAOSOwTlA3YUSwFSt23piTUz9fd+e79xhEzLis6Tiarir0EwADu5tHtZezVMzkD4q4hf+qnpFwx9/F8pUd8eU0T6+fvchQyDE8JhTsTAVdKeD7UGjEwr8lbQ0QVVqXf0i3LWLkkrw0IGt4+NKMgp2WcmDmMkcf+fLYBFJmtrb2KQEgG6nc3IG5Bjik2t34BtYrGWfH9FQR9weBitJRMLfq4Lsmv++j9HlehnCdTlHAzEHpUCvSRw8HPQhhMNBg3zYMAWgM9FpPaUuTKFlkjHJbT4w==