How-To de facturación electrónica para unixeros (generación de sellos)

Importante

Esta guía esta enfocada a generación de facturas electrónicas por “medios propios”, por favor leanla completa, así como los enlaces recomendados, antes de ensayar con sus certificados.

Entendiendo el requerimiento

La factura electrónica no es tan solo un sello que se pone a un documento, es un mecanismo completo de fiscalización que empezará a operar obligatoriamente a partir del 1o de enero del 2011.

Este consiste en el firmado e información por medios digitales a la Secretaría de Hacienda y Crédito Público (SHCP) por medio de su entidad de control conocida como Sistema de Administración Tributaria (SAT) de las facturas que emitimos y recibimos.

El mecanismo incluye a saber dos versiones en su operación, una conocida como “facturación por medios propios” (versión 2.0) y una que utiliza un intermediario o “proveedor autorizado de certificación” (versión 3.0), esta última forma es donde la fiscalización es total.

En ambos mecanismos debes contar con tu Firma Electrónica Avanzada (FIEL) que es un manejo de Public Key Infrastructure (PKI) en la que el SAT es el organismo certificador (Certificate authority o CA) que emite Certificados digitales que avalan al emisor, en este caso al contribuyente.

Es muy importante saber que las llaves privadas de la FIEL, la de los sellos y los paswords de las mismas NUNCA se deben proporcionar a terceros, según la ley es responsabilidad total del contribuyente el manejo y seguridad de estas llaves. Si a una empresa que emite facturas electrónicas les delegas tus passwords (para facilitar el proceso de su sistema hacia tí), le estas dando un cheque al portador con el cual pueden emitir una factura de la compra venta de tu empresa, coche, casa, etc, y legalmente dejarte en la calle. BAJO NINGUNA CIRCUNSTANCIA DES TUS CLAVES. Si ya hiciste esta soberana estupides, revoca tus certificados y acude al SAT.

Todo esto esta basado en el Famoso Anexo 20 publicado en el diario Oficial (en formato PDF). Es importante que lean el artículo 29 del Código Fiscal de la Federación

Aquí esta un comunicado de prensa del SAT en el que anuncia y explica el proceso de transición hacia la Facturación Electrónica (en formato pdf).

Obteniendo tus certificados

Si ya cuentas con la FIEL, los pasos a seguir para obtener tus Certificados de Sello Digital (CSD) son sencillos, pero pueden llegar a ser algo confusos.


  1. Tienes que obtener el Programa SOLCEDI que es una aplicación windows, pero que opera perfectamente con WINE con una instalación base del mismo. En mi caso lo hice en una Mac utilizando un virtualizador llamado Parallels.

  2. El SOLCEDI es un generador de llaves privadas y públicas que nos permite, a partir de la FIEL, crear las llaves de los sellos digitales, así como el archivo de requerimiento (.req) para que el SAT emita un certificado al mismo (.cer).

  3. Una vez obtenido el archivo de requerimiento (.req) hay que “ensobretarlo” para generar un archivo con terminación .sdg, esto se hace también con la aplicación SOLCEDI

  4. Ya con nuestro archivo .sdg tenemos que enviarlo a una aplicación llamada CertiSAT Web en la que mandaremos el archivo .sdg y obtendremos el certificado de nuestros sellos digitales.

  5. Despues debemos pedir los folios por medio de otra aplicación conocida como SICOFI donde a partir de la FIEL pediremos los folios.

Nota: Tanto el CertiSAT como el SICOFI usan aplicaciones de Java que no necesariamente operan bien con algunos navegadores. Queda al lector buscar como hacer que operen para completar su proceso. en mi caso use el Explorer de MS con el virtualizador de Parallels.

Puedes pedir múltiples Sellos a partir de una FIEL, por ejemplo para que cada sucursal o unidad de negocio maneje su firma de facturas.

Aquí esta un video en Youtube (cortesía de My$uite Services)que explica paso a paso esto:

Jugando con los certificados

Todo el manejo de certificados se hace utilizando OpenSSL y la conversión de facturas y manejo de cadena original se hace con xsltproc, ambas herramientas estan disponibles en las distribuciones de Unix/Linux mas populares y en MacOS X

Esto ya lo hice con mis llaves, pero para fines didácticos, vamos a mostrar el esquema de manejo de llaves y firmado con uno de los certificados de prueba del SAT:

$ wget ftp://ftp2.sat.gob.mx/asistencia_servicio_ftp/publicaciones/solcedi/Cer_Sellos.zip

También los certificados raíz y padres para posteriormente hacer verificaciones:

$ wget ftp://ftp2.sat.gob.mx/asistencia_servicio_ftp/publicaciones/solcedi/Cert_Prod.zip
$ wget ftp://ftp2.sat.gob.mx/asistencia_servicio_ftp/publicaciones/solcedi/Certificados_P.zip

Desempacamos el contenido y utilizamos alguno de los certificados de prueba al azar:

$ unzip Cer_Sellos.zip 
Archive:  Cer_Sellos.zip
 extracting: aaa010101aaa_csd_09.key  
  inflating: aaa010101aaa_csd_10.cer  
 extracting: aaa010101aaa_csd_10.key  
  inflating: aaa010101aaa_csd_01.cer  
 extracting: aaa010101aaa_csd_01.key  
  inflating: aaa010101aaa_csd_02.cer  
 extracting: aaa010101aaa_csd_02.key  
  inflating: aaa010101aaa_csd_03.cer  
 extracting: aaa010101aaa_csd_03.key  
  inflating: aaa010101aaa_csd_04.cer  
 extracting: aaa010101aaa_csd_04.key  
  inflating: aaa010101aaa_csd_05.cer  
 extracting: aaa010101aaa_csd_05.key  
  inflating: aaa010101aaa_csd_06.cer  
 extracting: aaa010101aaa_csd_06.key  
  inflating: aaa010101aaa_csd_07.cer  
 extracting: aaa010101aaa_csd_07.key  
  inflating: aaa010101aaa_csd_08.cer  
 extracting: aaa010101aaa_csd_08.key  
  inflating: aaa010101aaa_csd_09.cer  
 extracting: Contrase?a de Clave Privada.txt  
  inflating: aaa010101aaa_FIEL.cer   
 extracting: aaa010101aaa_FIEL.key

Vamos a usar el CSD “aaa010101aaa_csd_08” para generar los componentes que necesitamos para firmar los documentos. es necesario manejar el certificado (.cer) y la llave privadad (.key) del CSD.

La llaves se manejan bajo una norma conocido como ASN1 en sus variantes de Basic Encoding Rules (BER) y Distinguished Encoding Rules (DER), pero para manejar las llaves con OpenSSL las transformaremos a formato Privacy-enhanced Electronic Mail (PEM).

Ahora vamos a transformar a formato PEM el archivo de llave privada del CSD:

$ openssl pkcs8 -inform DER -in aaa010101aaa_csd_08.key -out aaa010101aaa_csd_08.key.pem -passin pass:a0123456789

El archivo resultante se ve así:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDVvLjg4dC8rIWzeRV6v+ZxYTpzgiK11bHLeYRYF8Pho+1fTeRn
7oOUdGfYSUEsqXV8s99F+rdJeA9Ma9iAt5zYBW+qkWlr8NDkkxQyMiOv8oEoJiXF
sNWekAhnniyFoPn9pbA1FVBfBsaIe82HKi+Vq0Nd0QKh28afj2f6yhwZnwIDAQAB
AoGACngF7i3hVXx1yAakQLDpjqAehs3W+WUQIlE/ZDk1xPWMiOB90YFjPIA/Hd7o
rFFYidUdmIXhOF4DEdEud4+GxQ8E3tlQPIB+0xF5yVor/CbDLmzGKu3Ued5eefeS
R2LdhlLjTGOr7MXM3Dw2nEoiTFvzOHr6qOnlrIUzyy6xEgECQQDq+NA76TZVzivW
LE2OrL9vtHkBF9+91mvY7lg0uCbsQPjJGlu3nFHyxRpJH1WaJxmOvD9aAlrp4B9M
8vC2Rh2BAkEA6N1sQ2P+CmV85qCHpwbIvEX4XAj6NMJK5F9qpJwrQVSZAXXYz2ci
ytLaafXFCs1uDjTIKJhKaNd5fZty1NAHHwJBALJPMI5WUrJYq3Fy20QrGXcmaDEJ
MfP4tIzBilQvbvIX9/N8Oh+i05k8M89LpQU/KKjld9nRMbaLKpWVQk+/84ECQBf1
iEkaxa2eKY61H5/w08CDVn1pswywnPIIWzmak9zB7og27trQGsVRkoVqcx6camFt
ztZWbPmCig6Bavw4dzMCQC4kCq50HLSLaUYc/CqTRjHU4HPBHHolDXKvViBeZNl0
n3Nh/XzJqVCP/AbPcpTmw53wf6Nl9PHHi6EfKMnZMug=
-----END RSA PRIVATE KEY-----

Pero en este paso la llave privada esta expuesta, ya que al transformalo en formato PEM, esta quedo con el password embebido y en este momento es un “cheque al portador”, con el cual pueden firmar sellos de facturas indiscriminadamente.

Se recomienda proteger de la siguiente manera:

$ openssl rsa -in aaa010101aaa_csd_08.key.pem -des3 -out aaa010101aaa_csd_08.key.pem.secure
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
 
$ mv aaa010101aaa_csd_08.key.pem.secure aaa010101aaa_csd_08.key.pem

El “Pass Phrase” puede ser cualquier cosa que queramos, no tiene que ser ni el password del CSD o de la FIEL, digamos que es una firma para esta chequera en especifico.

Ahora el certificado se vera así:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,C3D4161A4C34F52F
 
j8KgGJgH3TNrucpAFI7LyiFLOuPULgfifw4/MI+52RvjV355gYQD0LUIxPhvaWEm
goRqkWewc4zx5i7zCjeUQxU77lv2xEKuxGgKVBOW/C48CRHpbV4vqFWWJikV0eei
oQwCm2ipscfW4Vwgz8KT4OZTByqxVm8/ptRSsMHTazBpcA7+93GkC+lOPBWBsU9H
4cT/t0m3/K1qgryC5m19ovdLJ29V5dNWf2Zl0G/GrRhfecpWA+4/ZpqELovyOSpU
N/325k6YyWLEScrM6DIbpMmE1rxKmvPrGJk/rpxTwjLulBBueRD23fyrzPePp07q
bbV+gxf1UAOwUpL9vSAt6ezQlELM+xjMyOLm/UMW+Mnrx+V+H6KfrqcVboyG008z
o1mDBZe9S947hu2a2PUd6hlY2Uhn3pbRaXSlysW7VVi3fyR8Har6iq2uczQ5xz9H
joR8H56//WM2QQpqfZxMhBtGgtynrdVvFJrCsADEq+xYwxCevgYfPQ1C5the8HjO
RjRbm1cZ9B4moTDwpZBjYqs3T3KGtUeGhbCbdUYufzg2KbQCydWjPisNbD/JPZ0g
alPveWlETKYHuyiUoKD+yKdeKRgQpS0waAQb655QWQX+mte0HAdFwkh+OT3qBc3t
mn8sz0ms0nlvKoaBapE3e5UqmvmlVY0WCh7wvKIGYfqG1Q2EVN6m0qLzc8Yr4T18
IWz6azwv5J+kuob7erOBrWHUV1mK21qiMVYNdUBmvLDvBlaFaozaSEWypEkRTWsV
bCsTdhTrCOV2BWKbBaNejOzxPAnvbFAVj581JYxxPDWfNdvPLxhOUQ==
-----END RSA PRIVATE KEY-----

Este archivo dejenlo en alguna ruta (path) seguro en el servidor que utilizarán para generar sus facturas.

Ahora tenemos que trabajar en el certificado del CSD, este es público y debe estar a la disposición de nuestros clientes para que verifiquen la autenticidad de nuestros documentos.

$ openssl enc -base64 -in aaa010101aaa_csd_08.cer | tr -d "\n" > aaa010101aaa_csd_08.cer.txt

El Resultado lo guardamos para usarlo posteriormente. Normalmente se embebe en el XML que utilizaremos como machote de la factura a procesar. El contenido debe verse así (pero sin retornos de carro o cambios de linea):

MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDcwDQYJKoZIhvcNAQEF
BQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZp
Y2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1p
bmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcG
CSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkM
HUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDEL
MAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcM
CUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkC
DCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAx
NjU4NDZaFw0xMjA3MjkxNjU4NDZaMIGWMRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQ
BgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6IFNBMSUwIwYDVQQtExxB
QUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBBQUFBMDEw
MTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCA4MIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDVvLjg4dC8rIWzeRV6v+ZxYTpzgiK11bHLeYRYF8Pho+1fTeRn
7oOUdGfYSUEsqXV8s99F+rdJeA9Ma9iAt5zYBW+qkWlr8NDkkxQyMiOv8oEoJiXF
sNWekAhnniyFoPn9pbA1FVBfBsaIe82HKi+Vq0Nd0QKh28afj2f6yhwZnwIDAQAB
o4HqMIHnMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMB0GA1UdDgQWBBSXXSAB
98HZaYvKFyKXq5u8z4SG+zAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcGtpLnNh
dC5nb2IubXgvc2F0LmNybDAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0
dHA6Ly9vY3NwLnNhdC5nb2IubXgvMB8GA1UdIwQYMBaAFOtZfQQimlONnnEaoFiW
KfU54KDFMBAGA1UdIAQJMAcwBQYDKgMEMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0G
CSqGSIb3DQEBBQUAA4IBAQAlyBvfqLEsWYW11levSQLbsvCpaWmIqtbhfM65Ly+b
3848+S3WF9qZJLbH6NkViGUKy9WtTOwegicPSY/dihx1ZDOplARutbrscpLGqwfK
sg/qh7ppK7CwqZv5rvrjnaflI8KDV9b+2hsyI0oGY9kVnZb0GgpNZMAKvUmvqXq5
Z4ehoNWJmvixV7MgnX/heCZEcKZbR1pIoropUgiR5M8TUF9SUQlPPyRHgNA/v6vN
wwZT+JYa62x65IrguUgLCg3DJgo4hk4zADM81Irn3jiTLBZcF2LTQageqxYxSj8M
CWz7vGoB8Kv70CLY+Xin/IscCmZ2ohbG636sFNi6so4T

Guardamos este resultado para empezar a manejar las facturas

Las facturas y la “Cadena Original”

La cadena original se obtiene de la transformación del formato XML que define la factura y el hash de esta es la que se firma

Hay dos cosas importantes en la generación de documentos y sus diferencias:

Medios Propios se le conoce como versión 2.0 y utiliza una regla de transformación de XML que utiliza el archivo cadenaoriginal_2_0.xslt, la cadena original se procesa con MD5 y el resultado de esto es el que se firma con la llave privada para generar el sello digital. En esta modalidad nosotros controlamos el número de folio a emitir. el SAT debe tener acceso a todos nuestras facturas emitidas y recibidas por algún medio (página WEB, FTP, etc.). Esta solo es válida si emites comprobantes antes del 1o de enero del 2011 y estas excento de la obligación de la regla de intermediario (PSCFDI).

Proveedor Autorizado de Certificación, tambien conocidos como PSCFDI, utilizan la versión de cadenaoriginal_3_0.xslt (en el ftp del SAT). Usa SHA1 para generar el hash a firmar. Cuando se usa esta modalidad, los folios de la factura son definidos por el proveedor del servicio, no por nosotros y debe llevar la firma digital de este proveedor en el documento sellado. El SAT recibe en linea cada factura emitida, ya que el PSCFDI debe informar a la SHCP cada movimiento que efectue en nuestro nombre. Esta forma es obligatoria a partir del 1o de enero del 2011 si no has facturado previamente por medios propios (versión 2.0).

Ya que tenemos el achivo de transformación de la cadena original, en mi caso uso medios propios y yo genero mi sello (versión 2.0), necesito definir un machote de factura en XML (“factura.xml”) con la siguiente información mínima:

<?xml version="1.0"
    encoding="UTF-8"?>
 
<Comprobante xmlns="http://www.sat.gob.mx/cfd/2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"
    version="2.0"
    serie="A"
    folio="1"
    fecha="2010-12-18T15:27:13"
    sello=""
    noAprobacion="1"
    anoAprobacion="2006"
    tipoDeComprobante="ingreso"
    formaDePago="Contado en una sola exibicion"
    noCertificado="00001000000100000001"
certificado="MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDcwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAxNjU4NDZaFw0xMjA3MjkxNjU4NDZaMIGWMRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQBgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6IFNBMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBBQUFBMDEwMTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCA4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVvLjg4dC8rIWzeRV6v+ZxYTpzgiK11bHLeYRYF8Pho+1fTeRn7oOUdGfYSUEsqXV8s99F+rdJeA9Ma9iAt5zYBW+qkWlr8NDkkxQyMiOv8oEoJiXFsNWekAhnniyFoPn9pbA1FVBfBsaIe82HKi+Vq0Nd0QKh28afj2f6yhwZnwIDAQABo4HqMIHnMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMB0GA1UdDgQWBBSXXSAB98HZaYvKFyKXq5u8z4SG+zAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcGtpLnNhdC5nb2IubXgvc2F0LmNybDAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNhdC5nb2IubXgvMB8GA1UdIwQYMBaAFOtZfQQimlONnnEaoFiWKfU54KDFMBAGA1UdIAQJMAcwBQYDKgMEMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4IBAQAlyBvfqLEsWYW11levSQLbsvCpaWmIqtbhfM65Ly+b3848+S3WF9qZJLbH6NkViGUKy9WtTOwegicPSY/dihx1ZDOplARutbrscpLGqwfKsg/qh7ppK7CwqZv5rvrjnaflI8KDV9b+2hsyI0oGY9kVnZb0GgpNZMAKvUmvqXq5Z4ehoNWJmvixV7MgnX/heCZEcKZbR1pIoropUgiR5M8TUF9SUQlPPyRHgNA/v6vNwwZT+JYa62x65IrguUgLCg3DJgo4hk4zADM81Irn3jiTLBZcF2LTQageqxYxSj8MCWz7vGoB8Kv70CLY+Xin/IscCmZ2ohbG636sFNi6so4T"
    subTotal="21500.00"
    descuento="0"
    total="24940.00">
 
  <Emisor rfc="CAJU010166K67"
    nombre="Juan Cama Nei">
     <DomicilioFiscal calle="Av. Sal Si Puedes"
    noExterior="13"
    noInterior="666"
    colonia="Morelos"
    localidad="Distrito Federal"
    municipio="Cuauhtemoc"
    estado="Distrito Federal"
    pais="Mexico"
    codigoPostal="06000"/>
     <ExpedidoEn calle="Av. Sal Si Puedes 13"
    localidad="Distrito Federal"
    municipio="Cuauhtemoc"
    estado="Distrito Federal"
    pais="Mexico"
    codigoPostal="06000"/>
   </Emisor>
 
  <Receptor rfc="ROAF641217Q94"
    nombre="Fernando -El Pop-">
     <Domicilio calle="Av. Division del Norte"
    noExterior="69"
    noInterior="1"
    colonia="Letran-Valle"
    localidad="Distrito Federal"
    municipio="Benito Juarez"
    estado="Distrito Federal"
    pais="Mexico"
    codigoPostal="03650"/> 
  </Receptor>
 
  <Conceptos>
     <Concepto cantidad="1"
    descripcion="Servicios Profesionales"
    valorUnitario="21500.00"
    importe="3440.00"/> 
  </Conceptos> 
 
  <Impuestos totalImpuestosTrasladados="3440.00"> 
    <Traslados> 
      <Traslado impuesto="IVA"
    tasa="16.00"
    importe="3440.00"/> 
    </Traslados> 
  </Impuestos> 
</Comprobante>

Este documento en xml (“factura.xml”) puede ser facilmente generado a partir de una base de datos, queda al lector la generación de este documento base.

Ahora en el campo que dice certificado=”” pusimos lo que guardamos en el archivo “aaa010101aaa_csd_08.cer.txt”, ya que este es el que vamos a informar a nuestro cliente.

Creando el “sello”

Ahora creamos el sello digital en un solo paso:

sed -i -e 's:sello=\"\":sello=\"'$(xsltproc cadenaoriginal_2_0.xslt factura.xml | openssl dgst -md5 -sign aaa010101aaa_csd_08.key.pem | openssl enc -base64 -A)'":' factura.xml

[UPDATE]: A partir del 1o de enero del 2011, aun utilizando “medios propios”, tendremos que usar SHA1 en lugar de MD5:

sed -i -e 's:sello=\"\":sello=\"'$(xsltproc cadenaoriginal_2_0.xslt factura.xml | openssl dgst -sha1 -sign aaa010101aaa_csd_08.key.pem | openssl enc -base64 -A)'":' factura.xml

Solo recuerden que para verificar una factura electrónica anterior al 1o de enero deberemos usar MD5.

Manda algunos warnings y espera la entrada del password que definimos cuando aplicamos criptografía al archivo “aaa010101aaa_csd_08.key.pem”.

Si revisan el documento “factura.xml” veran que el campo de sello tiene este valor (ejemplo calculado con MD5):

sello="YPVa00DkxogixDyLeU515SfkIo4c8ZlErSmQtutMgS2HV7xyuyckDQGUmatucV7T2J1AE5wm44LhKIbnAt6hpJR16H8bdZhGaDaIZyFnvnH1GDTJ94EXaF5kYC9KgUpcJcmmfmaQUYHjQS63EXEQusZqRfNehvaHbvhyIxbqSJQ="

Entendiendo este comando “todo en uno”

Si quieren obtener la cadena original le dan:

xsltproc cadenaoriginal_2_0.xslt factura.xml

y obtienen:

||2.0|A|1|2010-12-18T15:27:13|1|2006|ingreso|Contado en una sola exibicion|21500.00|0|24940.00|CAJU010166K67|Juan Cama Nei|Av. Sal Si Puedes|13|666|Morelos|Distrito Federal|Cuauhtemoc|Distrito Federal|Mexico|06000|Av. Sal Si Puedes 13|Distrito Federal|Cuauhtemoc|Distrito Federal|Mexico|06000|ROAF641217Q94|Fernando -El Pop-|Av. Division del Norte|69|1|Letran-Valle|Distrito Federal|Benito Juarez|Distrito Federal|Mexico|03650|1|Servicios Profesionales|21500.00|3440.00|IVA|16.00|3440.00|3440.00||

El MD5 de la cadena original es:

ece01145d293b01640ea296115f2af75

Lo que se firma es el MD5 de la cadena original y el resultado es el “sello”.

Validación de la factura

Ahora vamos a probar el archivo resultante (“factura.xml”) en el Validador de forma y sintaxis de Comprobantes Fiscales Digitales del SAT (otra aplicación en Java), y verán esta salida:

Aquí nosotros embebimos el Certificado, pero este por ley es “opcional”, en caso de que este campo de certificado no tenga nada, el validador preguntará por el archivo de certificado para poder validar, en este caso el archivo “aaa010101aaa_csd_08.cer”.

Con esto ya generaron una factura válida, pero en el siguiente artículo pondré una de las partes mas importantes en el ciclo de la factura electrónica: La validación, ya que por ley, el que recibe una factura electrónica, es responsable de validarla.

[UPDATE]: Por cambios en el SAT ahora es necesario marcar los archivos con algo conocido como BOM (Byte order mark). Para ver como corregir esto lea Castrosidades del SAT para la factura electrónica: Ahora necesitas BOM.

Problemas en la veracidad de los comprobantes

Los verificadores del SAT solo comprueban la validez del certificado a partir de la llave, de hecho, generé certificados que pasaron el validador de hacienda a partir de mi FIEL. Esto quiere decir que personas que no se han dado de alta en el trámite de generación de sellos por medios propios, pueden mandar facturas válidas para la SHCP, aunque no lo sean. de allí que hay que hacer mecanismos de verificación en la recepción del documento.

De hecho, usando los certificados de un web server (como Apache) con OpenSSL, podrías generar certificados válidos para los validadores del SAT.

La continuación de este artículo esta aquí (verificación de facturas).

Referencias


  1. Anexo 20 de la ley publicada el el Diario Oficial de la Federación el 15 de junio de 2010.

  2. artículo 29 del Código Fiscal de la Federación

  3. Uso de XSL para transformar la factura electronica XML

  4. Implantación de la Factura Electrónica Libre 2

  5. Referencia de XLS para transformaciones de XML

  6. FAQ sobre Factura Electrónica(en PDF) cortesía de Factura electrónica (CFD / CFDI)

Agradecimientos

Agradezco la ayuda de Salvador Ortíz de Matías Software Group, Fernando Ortíz y de Mauricio Baeza de Universo Libre por la ayuda y orientación prestada con sus opiniones y artículos.

Autor: Fernando “El Pop” Romo (pop at cofradia.org), twitter @El_Pop


6 votes, average: 5.00 out of 56 votes, average: 5.00 out of 56 votes, average: 5.00 out of 56 votes, average: 5.00 out of 56 votes, average: 5.00 out of 5 (6 votes, average: 5.00 out of 5)
You need to be a registered member to rate this post.
Loading...
Paranoia Fan Club, Programacion, software libre, Tips técnicos | RSS 2.0 |     13,059 views

RSS feed

16 Comments »

Comment by leon
2010-12-20 21:44:30

no pos ‘ta fácil…

 
Comment by el_pjuan
2010-12-21 04:28:18

Creo que por eso es el requisito de usar software para llevar la contabilidad. Según el asesor del SAT al que le pregunté, al generarse la factura, deber haber un registro en el software del ingreso que se hace. Solo que no he encontrado los requisitos específicos que debe llevar el software de contabilidad.

Saludos

 
Comment by El Pop
2010-12-21 13:12:03

Bueno, al que le interese ver esto y algunos detalles mas, daré el día 28 de diciembre a las 7:00 PM en TelmexHUB una plática al respecto: http://cofradia.org/2010/12/21/platica-sobre-facturacion-electronica-para-programadores-en-telmexhub/

 
Comment by jach
2010-12-22 10:45:01

Muy interesante, alguien sabe donde están los requisitos para ser una empresa intermediaria de facturas electrónicas?

 
Comment by agreyes
2010-12-22 11:30:57

Excelente procedimiento técnico, gracias por compartirlo.

Tengo una pequeña contribución al mismo, a partir del 1 de enero de 2011 los CFDs que se generen por medios propios (Versión 2.0), deberán utilizar el algoritmo SHA1, ésto en razón de que el volúmen del hash que genera SHA1 es mayor que el que genera MD5.

Lo anterior fué publicado en la Resolución Miselánea Fiscal del 23 de Septiembre de 2010.

 
Comment by el_pjuan
2011-01-03 03:21:38

No se que tan conveniente sea, pero bajé los includes del archivo cadena_original.xslt, cambié las referencias, y en cada archivo cambié la versión del xsl:output de 2.0 a 1.0 y los warnings del xsltproc desaparecieron. Gracias por la información.

Ya tengo una versión preliminar para generar los cfd en php. Por ahora es medio manual, pero ya estoy trabajando en el formulario.

Saludos!

 
Comment by tmsanchez
2011-01-03 15:47:30

Que tal.

En mi caso también tuve que bajar los archivos XLST (al parecer el día de hoy –lunes 3–) quitaron el archivo
http://www.sat.gob.mx/sitio_internet/cfd/terceros/terceros.xslt y me estaba marcando error al generar la cadena original.

Las lista de los otros archivos XLT’s los pueden encontrar aquí.

http://www.sat.gob.mx/sitio_internet/e_sat/comprobantes_fiscales/15_9255.html

Saludos

 
Comment by El Pop
2011-01-03 21:21:52

@tnsanchez: veo los archivos de cadena original en los paths que menciono en el artículo, revisaré la liga que mandas para ver las diferencias. Aunque el documento del SAT que mencionas dice que son “complementos”.

 
Comment by tmsanchez
2011-01-03 21:48:39

Que tal Pop.

Aquí hay más información al respecto:

http://www.validacfd.com/phpbb3/viewtopic.php?f=9&t=160&hilit=terceros.xslt&start=10

y aquí estan los complementos en un zip por si alguien los requiere

Saludos

 
Comment by tmsanchez
2011-01-03 21:55:35

Hola de nuevo.

Según comentan en este blog, ésto se debe a que …”desaparece el complemento “por orden y cuenta de terceros”… http://www.kauli.info/?p=881

Saludos

 
Comment by El Pop
2011-01-04 02:52:17

@tmsanchez creo que ya entendí: Lo que quieres es tener los archivos de “include” del XSLT para poder procesar fuera de linea. Al analizar un poco los “includes” y buscarlos “a pata”, el único que falta es el de “terceros” que mencionas efectivamente.

Pero lo peor es que el propio validador del SAT ya no funciona ya que tampoco puede generar la cadena original 😛

 
Comment by El Pop
2011-01-04 03:20:13

pues aquí dejo un work-around al respecto. Pero esto afecta a los validadores del propio SAT.

 
Comment by medisoft
2011-01-05 11:58:16

Hola! Yo me equivoque y emiti una factura que ya reporte, usando en vez del certificado y llaves del sello digital, los de la fiel. El sistema del sat no me dijo nada malo, y acepto mi reporte, que debo hacer ahora?

Alguna idea?

 
Comment by el_pjuan
2011-01-05 15:03:01

la reportaste inmediatamente? puedes cancelarla, imagino que también se puede hacer de manera inmediata. Según yo, los folios emitidos y cancelados se reportan mensualmente.

 
Comment by el_pjuan
2011-01-05 15:28:29

ups. creo que leí mal. Sería mejor dicho, un reporte complementario.

 
Comment by medisoft
2011-01-07 13:33:50

Ya, entonces, lo que debo hacer es cancelarla, generar una nueva, aunque ya haya generado otras en enero, y luego enviar el reporte complementario de diciembre?

 
Name (required)
E-mail (required - never shown publicly)
URI
Your Comment (smaller size | larger size)
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> in your comment.

Trackback responses to this post