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:
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.
Almacenamiento en una base de datos no relacional las licencias, claves y demás al ser
binarios/base64, con la seguridad necesaria.Creación de una API para revocar licencias y consultarlas.
Almacenamiento de claves pública y privada por cliente, sin necesidad de almacenarlo en
un fichero físico.Definición de una forma de revocar las licencias, forma adicional a la fecha de expiración.
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.
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
UUIDsCreació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 el Q2 se pretende dar solución al modelo Software as a Service, implementando la solución de:
Integración con control center
API de gestión de licencias y productos (si fuera necesario).
Sistema de autenticación y comprobación de roles.
API de comprobación de licencias.
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.