Son muchos los interrogantes que se nos presentan cuando intentamos desarrollar un proyecto de firma electrónica de documentos, por ejemplo, con la firma electrónica de una factura. El objetivo de este artículo es aclarar un poco algunas de las múltiples dudas que me surgieron personalmente en el momento de enfrentar este tipo de desarrollo con mi herramienta favorita, Embarcadero Delphi.
¿Qué es una firma electrónica?
Lo primero que debemos tener claro es, qué es y para qué sirve una firma electrónica? Pues bien, una firma, es un mecanismo jurídico que garantiza la identidad y responsabilidad del autor de un documento o transacción electrónica; es el equivalente a la firma manuscrita, en la cual una persona acepta el contenido de un mensaje a través de cualquier medio electrónico válido, esta firma es un requisito indispensable cuando hablamos de Facturas Electrónicas.
¿Para qué sirve la firma electrónica?
- Mantener la integridad de la información en el tiempo.
- Verificar que la información no fue manipulada.
- Asegurar la confidencialidad del contenido de los mensajes (solamente los autorizados pueden ver o leer el mensaje).
- Garantizar la identidad del emisor de un mensaje y/o el origen del mismo, y tener la plena seguridad de que quien remite el mensaje es realmente quien dice ser.
- Ratificar que el documento que se firma es legal.
Antes de empezar con los diferentes tipos de firma, es de vital importancia tener claro qué es y cuáles son los objetivos fundamentes al utilizar una firma electrónica en cualquier documento.
¿Qué tipos de Firma Electrónica existen?
- Usando una firma biométrica (manos, huellas digitales, ojos y voz).
- Firma con un lápiz electrónico al usar una tarjeta de crédito o débito en una tienda.
- Marcando una casilla en una computadora, a máquina o aplicada con el ratón o con el dedo en una pantalla táctil.
- Usando una firma digital (es un mecanismo criptográfico que permite al receptor de un mensaje firmado digitalmente identificar a la entidad originadora de dicho mensaje).
- Mediante usuario y contraseña.
- Usando una tarjeta de coordenadas.
En adelante, nos centraremos en la firma digital, que es el mecanismo criptográfico utilizado para firmar facturas electrónicas.
Con el inicio de siglo, la implementación de la firma digital se aceleró notablemente, lo que ha conducido a la mayoría de los gobiernos a establecer una normativa que impulsa la obligatoriedad de su uso para así poder establecer un mayor control contra el fraude fiscal.
Brasil, Chile, Uruguay, Ecuador, Colombia y países de la unión Europea, son ejemplos de los que ya han optado por un mecanismo como la firma digital para darle integridad y autenticidad a sus facturas electrónicas, otros entre tanto, como (Paraguay, El Salvador, República Dominicana y Venezuela), se encuentran ya en proceso de implementación.
Para poder realizar la firma electrónica de facturas, es necesario contar un DNI electrónico o un certificado digital. Los certificados digitales son emitidos por Proveedores de Servicios de Certificación.
Estructura XML para la firma electrónica.
La siguiente, es la estructura XML estándar para la firma digital.
- El elemento SignedInfo contiene o referencia los datos firmados y especifica qué algoritmo se usa
- SignatureMethod y CanonicalizationMethod son usados por el elemento SignatureValue y están incluidos en SignedInfo para evitar que sean modificados.
- Uno o más elementos Reference especifican el recurso que se está firmando por la referencia URI y cualquier transformación que vaya a aplicarse al recurso antes de firmar.
- DigestMethod especifica el algoritmo hash antes de aplicar el hash.
- DigestValue contiene el resultado de aplicar el algoritmo hash a el (o los) recurso(s) transformado(s).
- El elemento SignatureValue contiene el resultado de una firma codificada en Base64 (la firma generada con los parámetros especificados en el SignatureMethod) del elemento SignedInfo después de aplicar el algoritmo especificado por el CanonicalizationMethod
- El elemento KeyInfo permite opcionalmente al firmante especificar los destinatarios con la clave que valida la firma, generalmente en la forma de uno o más certificados digitales 509.
- El elemento Object(opcional) contiene los datos firmados en caso de ser una firma envolvente. Normalmente, es donde se define a información del perfil, como la política de firma en el caso de EPES.
Formatos admitidos para la firma electrónica.
El formato de firma, es la forma cómo se genera el documento de firma y cómo se guarda o estructura la información de firma en el documento generado. Los formatos existentes son los siguientes:
- CAdES (CMS Avanzado).
Es la evolución del primer formato de firma estandarizado. Es apropiado para firmar ficheros grandes, especialmente si la firma contiene el documento original porque optimiza el espacio de la información. Tras firmar, no podrás ver la información firmada, porque la información se guarda de forma binaria. - XAdES (XML Avanzado).
El resultado es un fichero de texto XML, un formato de texto muy similar al HTML que utiliza etiquetas. Los documentos obtenidos suelen ser más grandes que en el caso de CAdES, por eso no es adecuado cuando el fichero original es muy grande. - PAdES (PDF Avanzado).
Este es el formato más adecuado cuando el documento original es un pdf. El destinatario de la firma puede comprobar fácilmente la firma y el documento firmado. - OOXML y ODF.
Son los formatos de firma que utilizan Microsoft Office y Open Office, respectivamente.
XAdES, que es comúnmente utilizado para firma electrónica de facturas en varios países, define seis perfiles (formas) según el nivel de protección ofrecido. Cada perfil incluye y extiende al previo:
- XAdES-BES, forma básica que simplemente cumple los requisitos legales de la Directiva para firma electrónica avanzada,
- XAdES-EPES, forma básica a la que se la ha añadido información sobre la política de firma,
- XAdES-T (timestamp), añade un campo de sellado de tiempo, con fecha y hora exacta de la firma.
- XAdES-C (complete), añade referencias a datos de verificación (certificados y listas de revocación) a los documentos firmados para permitir verificación y validación off-line en el futuro (pero no almacena los datos en sí mismos),
- XAdES-X (extended), añade sellos de tiempo a las referencias introducidas por XAdES-C para evitar que pueda verse comprometida en el futuro una cadena de certificados,
- XAdES-X-L (extended long-term), añade los propios certificados y listas de revocación a los documentos firmados para permitir la verificación en el futuro incluso si las fuentes originales (de consulta de certificados o de las listas de revocación) no estuvieran ya disponibles,
- XAdES-A (archivado), añade la posibilidad de timestamping periódico (por ej. cada año) de documentos archivados para prevenir que puedan ser comprometidos debido a la debilidad de la firma durante un periodo largo de almacenamiento.
¿Qué necesito para obtener una firma electrónica?
Lo primero que debemos hacer es tener a nuestra mano toda la documentación con la normativa que exige el gobierno, y con base en esas especificaciones, se construye el documento en formato XML (Extensible Markup Language); una vez listo este fichero, procedemos a firmarlo electrónicamente, para lo que debemos tener disponible como mencionamos anteriormente, un certificado de dispositivo que permita la firma electrónica y haber elegido el componente o librería para su desarrollo.
Componentes para Firmar una factura electrónicamente con Delphi.
Existen algunas librerías y componentes en el mercado, entre los más conocidos encontramos, SecureBlackBox, son componentes de costo, muy completos, de los que podemos descargar su versión demo, la cual contiene gran variedad de ejemplos, que te permiten obtener la firma digital de una factura electrónica de una forma rápida y sencilla.
Existe también una utilidad de Microsoft llamada CAPICOM, que se puede usar para firmar datos y código digitalmente, comprobar firmas digitales, proteger la privacidad de datos, hacer hash de datos, cifrar y descifrar datos y obtener datos de los certificados digitales instalados. En este enlace podrás encontrar toda la información sobre su funcionamiento y descargas.
Otra librería usada comúnmente es OpenSSL, con la cual nos enfrentamos al reto de construir todo el proceso de firma digital paso a paso. La ventaja con esta librería, es que podemos encontrar suficiente información en Internet que seguro, nos ayudará a tener éxito en el proceso; existen muchos sitios de descarga, aquí dejo una recomendación de Wikipedia que contiene los enlaces de acuerdo al sistema operativo utilizado.
Por último, tal vez poco reconocida en el mercado, pero con muy buenos resultados para firma digital, es una DLL de ChilkatSoft, la cual podrás descargar aquí en versión demo. Es muy fácil de instalar y amigable a la hora de usar, con ella podrás obtener la firma en el formato requerido de una manera rápida.
Ahora, la recomendación desde mi experiencia.
Independiente del componente o librería que utilicemos, debemos realizar una investigación a fondo y tener muy claros tanto los conceptos como el proceso, además de conocer cada uno de los segmentos que componen la firma; si, sé que puede ser algo tedioso, pero sabiendo esto, podemos tener el criterio suficiente para elegir el componente o el modo adecuado de desarrollarlo. Esto sería un requisito indispensable en caso de elegir trabajar con OpenSSL, ya que todo el proceso para conseguir la firma hay que construirlo a pulso.
Si quieres acortar un poco de camino, en Abatic Soluciones Tecnológicas ofreceremos un curso detallado, con ejemplos prácticos y haciendo uso de diferentes componentes, para conseguir firmar un documento XML en formato XADES-EPES.
Este curso lo podrás encontrar en nuestra plataforma formativa Abatic.es a comienzos de septiembre del 2020.
¡Espero te animes a tomar nuestro curso!
Muchas gracias por el aporte; es realmente excelente, y me va a ayudar mucho en un campo en el que necesito ampliar mis conocimientos
Muchas gracias por su comentario, esperamos pueda encontrar respuesta a todas sus inquietudes sobre este tema en Abatic ST.
Excelente información, espero ampliar mis conocimientos para poder realizar un software de Facturación electronica para ayudar a la comunidad mas vulnerable de nuestro pais golpeado por el acoso de la DIAN y del gobierno en general para llenar sus arcas y bolsillos.