Desarrollo del License Manager

Resumen

Se pretende implementar una solución para la gestión de licencias de forma flexible, tanto para proyectos que tengan acceso a Internet como para otros que no estén preparados para ello.

Introducción

La solución tiene que ser flexible y permitir manejar muchos tipos de features (o características) ajustables
por cliente y proyecto, incluyendo revocación por features y demás.
Se contempla la solución en dos modelos diferentes:

  1. Software as a Service: los clientes usarían nuestras licencias y se podría comprobar, por ejemplo una vez al día contra nuestros sistemas si su licencia es correcta.

    1. Almacenamiento en una base de datos no relacional las licencias, claves y demás al ser
      binarios/base64, con la seguridad necesaria.

    2. Creación de una API para revocar licencias y consultarlas.

    3. Almacenamiento de claves pública y privada por cliente, sin necesidad de almacenarlo en
      un fichero físico.

    4. Definición de una forma de revocar las licencias, forma adicional a la fecha de expiración.

  2. On Premise: aquí entraría la problemática de que no podemos garantizar que no se corrompa el código usando ingeniería inversa y quitar de este mismo las comprobaciones de la licencia. En caso de que se produzca un uso fraudulento de nuestro producto siempre podríamos comprobar en nuestro sistema cuando ha caducado la licencia y mediante una auditoría ver cuánto tiempo lleva el cliente usándola ilegalmente.

    1. En este caso no podría revocarse la licencia, dado el supuesto de que no haya acceso a
      Internet.

Diseño Funcional

Una licencia es un binario (texto cifrado) que contiene una serie de características definidas por el usuario y
que soportaría los siguientes tipos de datos:


Además, contiene los siguientes atributos:

  • Identificador alfanumérico único

  • Fecha de expiración

  • Firma de la licencia

  • Nombre de la licencia

  • License Key. Generada con algoritmo seguro (License4j usa EC) o no (a elegir)

 

Un usuario para poder tener permisos CRUD de una licencia de un proyecto deberá estar dado de alta en el
sistema en ese proyecto y tener los permisos necesarios para las operaciones. Un usuario administrador de
un proyecto tendría sentido que pudiera modificar y revocar la licencia. Sin embargo, un usuario consumidor
de la misma no debería tener más allá de permisos de lectura.

Funcionalidad core

Un usuario administrador de un proyecto que quiera trabajar con licencias podrá a través del backoffice (License Management):

  • Añadir el proyecto al sistema de licencias

    • Generación de un KeyPair (clave pública y privada para ese proyecto)

  • Consultar las claves asociadas a un producto

  • Generar un archivo a partir de las claves asociadas al proyecto

  • Consultar todas las licencias del producto

  • Consultar una licencia concreta

    • Ver nombre de licencia

    • Ver de cada una de las características indicadas en la licencia

    • Ver fecha de expiración

    • Ver si está revocada

  • Crear una nueva licencia

    • Añadir tipo de licencia

    • Añadir N características, siendo N lo que decida el usuario

    • Elegir una fecha de expiración de dicha licencia

  • Editar una licencia

    • Esto cambiaría la firma de la misma

  • Revocar una licencia

  • Eliminar una licencia

  • Asignar usuarios que pueden usar la licencia

  • Revocar usuarios que pueden usar la licencia

  • Generar un archivo a partir de una licencia

 

Un usuario consumidor de una licencia (cliente que ha contratado un servicio) podrá a través del backoffice:

  • Consultar todas las licencias en las que tiene permiso

  • Consultar una licencia concreta en la que tiene permiso

    • Ver nombre de licencia

    • Ver de cada una de las características indicadas en la licencia

    • Ver fecha de expiración

    • Ver si está revocada

Un usuario consumidor de una licencia podrá a través del servicio SaaS:

  • Comprobar que su licencia es válida

    • Correctamente firmada

    • No está revocada

    • No está expirada

  • Obtener las características asociadas a esa licencia

Arquitectura y diseño técnico

Uso de License3j

License3j es una librería open source para administrar licencias en programas Java. Un archivo de licencia
es un archivo de configuración especial que está firmado de forma electrónica. Esta librería puede crear y
firmar licencias además de comprobar los parámetros con los que ha sido creada.
Entre sus características encontramos:

  • Creación y manipulación de features de muchos tipos, desde enteros, hasta strings, fechas y
    UUIDs

  • Creación y lectura de claves públicas y privadas indicando el algoritmo de forma sencilla (o
    compleja, según se requiera).

  • Creación y manipulación de licencias, añadiendo firmado en la misma licencia (no se firma la licencia completa, sino que se añade un atributo de firma a través de la clave privada indicada)

  • Lectura y escritura de licencias en archivos. Lectura y escritura de claves en archivos.

  • Bindeo de licencia a Hardware concreto, pudiendo negar su uso si no se trata del hardware indicado
    (esta parte es más compleja, pero es posible)

  • Manejo de licencias revocadas.

Diseño

Planificación

 

Durante la Q2 se han creado las APIs para la gestion de licencias y tipos así como para la validacion de los datos.

Las licencias pueden crearse desde el front aportando los datos necesarios.

 

 

Una vez rellenos los campos, se nos da la opcion de seleccionar los modulos disponibles en el producto, así como establecer una fecha de expiración del módulo, y de crear features propias.

 

Se ha desarrollado tambien una api para la verificacion de las licencias a traves de los ficheros codificados de licencias que se generan y a través de un identificador hash de la licencia.

Una vez con la licencia creada, podemos generar ficheros para su verificacion.

 

 

Así mismo, está disponible también la creación de tipos de licencia.

Creándose con un procedimiento similar a las licencias, una vez esté creada podremos seleccionar un tipo de licencia a la hora de crear una licencia, viniendo ésta con módulos predefinidos, o crear un tipo de licencia más adaptado a nuestras necesidades.

Está finalizado el desarrollo de la API que hace uso de los ficheros generados de las licencias para verificar su autenticidad e integridad.

Así mismo se están desarrollando en este momento las librerías para la comprobación de licencias, tanto en su versión API como en su versión sin conexión.


Durante el Q3 se complementarían el resto de:

  • Capa visual para gestión de licencias.

  • Librería de integración de la API de comprobación de licencias.

  • Librería de licencias sin acceso a Internet.