XAdES-BES con JavaScript, en el navegador y sin plugins

La generación de firma electrónica XAdES-BES con JavaScript del navegador es posible desde hace algunos años, si bien aún hace falta implementar mayores seguridades para el manejo de los certificados digitales. En este artículo se explorará su generación sin hacer uso de extensiones del navegador ni programas externos.

xades bes con javascript

En un anterior artículo se había explicado a detalle la manera de generar una firma electrónica en formato XAdES-BES que sea aceptada por el Servicio de Rentas Internas del Ecuador (SRI), y se había presentado una prueba de concepto:

Pruebas

Para probar que se esté generando un archivo XML firmado de manera adecuada, en especial si consiste en comprobantes electrónicos del Ecuador, se puede utilizar los servicios Web del SRI de comprobantes offline. Se debe primero solicitar al SRI el acceso a estos servicios Web a través de su sitio en Internet.

Para usar el servicio Web se debe primero codificar el comprobante firmado a base64, por ejemplo usando este sitio Web.

Una vez se tenga el comprobante codificado, se lo agrega al servicio Web de recepción:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ec="http://ec.gob.sri.ws.recepcion">
  <soapenv:Header/>
  <soapenv:Body>
    <ec:validarComprobante>
      <xml>AquiVaElArchivoCodificadoEnBase64TanLargoComoEs</xml>
    </ec:validarComprobante>
  </soapenv:Body>
</soapenv:Envelope>

Si la respuesta es RECIBIDA, se pasa al segundo servicio Web de autorización donde se agrega como argumento los 49 dígitos de la clave de acceso que consta en el comprobante:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ec="http://ec.gob.sri.ws.autorizacion">
  <soapenv:Header/>
  <soapenv:Body>
    <ec:autorizacionComprobante>
      <claveAccesoComprobante>AquiVaLaClaveDeAcceso</claveAccesoComprobante>
    </ec:autorizacionComprobante>
  </soapenv:Body>
</soapenv:Envelope>

Si la respuesta es un mensaje de error diciendo “LA FIRMA ES INVALIDA” entonces hubo una falla durante la generación de la firma electrónica, caso contrario cualquier mensaje de error distinto o un mensaje de operación exitosa indicará que la firma del comprobante fue aceptada como válida.

Depuración de errores

Pero qué hacer si la firma es inválida? Ya que no existe una especificación lo suficientemente detallada y clara como para guiar el desarrollo, y dado que la mayor parte de el presente esfuerzo ha sido ingeniería inversa, no hay una respuesta sencilla. Para ayudar a la depuración de los errores en esta implementación de la firma XAdES-BES con JavaScript se han seguido los siguientes siete pasos:

  1. Obtener una firma electrónica válida en el Ecuador.
  2. Descargar e instalar el facturador electrónico gratuito del SRI.
  3. Obtener un comprobante electrónico sin firma, y duplicarlo. Poner una de las copias en la carpeta Comprobantes/Generados del facturador.
  4. Abrir el facturador e ir a Procesos/Firmar Comprobantes en el menú. Hacer clic en el botón “Mostrar Archivos” y escoger el comprobante electrónico copiado. Escoger la correcta ubicación de la firma electrónica y hacer clic en el botón “Firmar“.
  5. Abrir el comprobante firmado en un editor de texto y extraer los ocho números aleatorios que se explicaban en el anterior artículo, y también la fecha de generación que consta por la parte final. Con estos nueve datos se abre el código fuente del generador de firmas XAdES-BES con JavaScript y se reemplaza la generación de estos valores por los datos extraídos.
  6. Una vez realizados los respectivos reemplazos en el código fuente, se genera la firma del mismo comprobante electrónico utilizado en el facturador.
  7. Comparando el resultado obtenido en el facturador y en el generador de firmas XAdES-BES con JavaScript, se puede identificar el lugar donde existen discrepancias, lo cual da pistas del lugar donde se encuentra el error.

Ventajas de firmar XAdES-BES con JavaScript en el navegador

La obvia ventaja de realizar la firma electrónica (y la razón de haber realizado todo este esfuerzo) es mejorar la usabilidad de los sistemas informáticos que  se utilizan para la facturación electrónica, en los siguientes puntos:

  • Facilidad de instalación, al no depender de ningún componente externo que realice la firma.
  • Mayor seguridad, al disminuir los puntos de fallo.
  • Mejores soluciones de facturación electrónica, al abrir la posibilidad de ofrecer sistemas “en la nube” que se accedan vía Web y que permitan realizar firma electrónica local, sin transferir el certificado digital a ningún servidor.
  • Compatibilidad con cualquier tipo de computador de escritorio, laptop, teléfono móvil y tablet, ya que la implementación de XAdES-BES con JavaScript permite usarlo en cualquier dispositivo que permita ejecutar navegadores modernos.

Adicional, se espera fomentar el uso más eficiente de recursos en sistemas de facturación electrónica, ya que la implementación XAdES-BES con JavaScript es de fácil comprensión (todo el mundo conoce JavaScript) y permite llevar el algoritmo a cualquier otro lenguaje de programación que se ajuste a los sistemas específicos, lo cual evitaría tener que instalar Java solo para realizar la firma.

Desventajas y peligros

A pesar de contar con tantas ventajas, existen aspectos que se los deben considerar con mucho cuidado antes de aplicar esta implementación en ambiente de producción:

  1. Dado que es una implementación nueva, no ha existido un tiempo suficientemente largo para filtrar posibles errores y aún pueden existir casos especiales no contemplados.
  2. No se puede firmar con tokens y otros dispositivos físicos donde se almacene la clave privada, ya que el navegador no puede acceder directamente a hardware externo sin utilizar plugins. Por el momento, la única solución es utilizar certificados digitales, pero…
  3. El riesgo más grave es que no existe un mecanismo adecuado para la manipulación de certificados digitales desde el navegador, lo cual abre numerosos riesgos de posibles ataques donde ciberdelincuentes extraigan el certificado digital. En los navegadores y en sistemas operativos se maneja este asunto guardando el certificado en una keystore, sin embargo aún no existe un mecanismo estándar para accederlo desde el navegador. El 15 de diciembre de 2016, es decir hace dos semanas de publicado este artículo, fue actualizado el estándar de la W3C que entre otras cosas trata sobre el acceso al keystore, llamado Web Cryptography API.  La implementación generalizada de este estándar puede llegar a solucionar tan grave problema, y mejorar el rendimiento.

Conclusiones

HTML5 y ECMAScript 2015 cambiaron lo que se puede y no se puede hacer en un navegador. La firma electrónica XAdES-BES con JavaScript es un ejemplo de ello, pero no hay que deslumbrarse con las nuevas tecnologías. En este caso concreto, no se recomienda su uso en un sistema abierto en el Internet, pero puede ser de utilidad en una Intranet corporativa donde exista un mayor control de los accesos al sistema. La incorporación del estándar WebCrypto de manera generalizada en los distintos navegadores permitirá utilizar los certificados digitales de manera mucho más segura, y si bien todavía está pendiente su implementación masiva, se espera que se la logre en el futuro cercano en vista de los grandes avances logrados al respecto en Chrome y Firefox.

Sin embargo, más allá del uso que se pueda dar al código fuente en JavaScript, está la comprensión del algoritmo que implementa la firma electrónica en formato XAdES-BES, lo cual facilita su implementación en cualquier lenguaje de programación que se requiera.

XAdES-BES con JavaScript, en el navegador y sin plugins
4.5/5, de 2 votos