Licenciamento com o License Manager no Java

Em uns dos projetos que participei tínhamos um requisito desejável que era a capacidade de a solução prover um método de licenciamento. A ideia era mais ou menos essa:
  • O primeiro deploy resultaria na criação de uma licença trial de 30 dias e limitada a um certo número de "dispositivos";
  • Uma das funcionalidades da aplicação é a de criar arquivos XML de configuração para telefones IP, porém teria que limitá-la ao número permitido de "dispositivos";
  • Ter a capacidade de inserir novas licenças aumentando o número permitido de dispositivos com a possibilidade de limitar o tempo de uso (tempo de expiração).
Com isso na mesa, antes de "reinventar a roda" comecei a pesquisar se existia algum framework/biblioteca e achei o License Manager e o TrueLicense. Optei pelo primeiro por causa do licenciamento do projeto :)

A biblioteca funciona de maneira parecida com o esquema de certificados. Para começar a criar as chaves e as licenças é necessário ter os seguintes jars:


Depois de acessar o referido diretório via CMD, basta executar o comando abaixo para gerar um par de chaves que usam o mesmo segredo AES 128-bit:

  • java -cp "licensing-licensor-ui-cli-1.1.0.jar;commons-io-2.4.jar;commons-codec-1.9.jar;commons-cli-1.2.jar;licensing-licensor-base-1.1.0.jar;licensing-licensor-ui-core-1.1.0.jar;licensing-licensor-ui-desktop-1.1.0.jar;licensing-core-1.1.0.jar" net.nicholaswilliams.java.licensing.licensor.interfaces.cli.ConsoleRSAKeyPairGenerator -password "PrivateAndPublicKeyPassword" -private "Private.key" -public "Public.key"
O resultado disso será a criação de dois arquivos, Private.key e Public.key no diretório dos jars. A chave privada é responsável por assinar uma licença, portanto ela será usada no processo de criação de uma instância, já a chave pública é usada na aplicação client, ou seja, aquela que o usuário irá inserir a licença, ela vai comprovar se o certificado foi realmente assinado pela chave privada ou não. Para assinar uma licença, num primeiro momento, sugiro executar o seguinte comando:

  • java -cp "licensing-licensor-ui-cli-1.1.0.jar;commons-io-2.4.jar;commons-codec-1.9.jar;commons-cli-1.2.jar;licensing-licensor-base-1.1.0.jar;licensing-licensor-ui-core-1.1.0.jar;licensing-licensor-ui-desktop-1.1.0.jar;licensing-core-1.1.0.jar" net.nicholaswilliams.java.licensing.licensor.interfaces.cli.ConsoleLicenseGenerator
Esse comando executa um wizard que auxiliará no processo de criação.


No final do processo ou ele lança a licença codificada em Base64 ou criptografada em AES num arquivo (depende do que você escolher no final do wizard). O ideal é que esse processo seja feito por meio de arquivos properties conforme explicado pelo autor do projeto (veja aqui).

Para ler o arquivo de licença basta implementar as interfaces PasswordProvider e PublicKeyDataProvider. Existe a classe abstrata DeserializingLicenseProvider que está parcialmente implementada cujo objetivo é ler o dado licenciável a partir de uma fonte que retorne um byte[]. O autor já criou uma implementação chamada FileLicenseProvider que pode ser usada inicialmente, mas como minha aplicação precisava ler a partir de um banco de dados, foi necessário estender a classe abstrata para implementar conforme minha necessidade.

Já dei a faca, agora o queijo é com você... :)

Comentários

  1. Olá bom dia, prezado era algo como o teu artigo que eu estava precisando, realmente deste a faca e o queijo mais....., existem desenvolvedores e desenvolvedores..., eu acessei a pagina do projeto observei que o link que vc deixou não tenho acesso, mais na pagina entendi as classes KeyGenerationExample.java e a createLicense.java mais nesta no final eu poderia por exemplo em um arquivo texto ( .lic ) salvar String trns = org.apache.commons.codec.binary.Base64.encodeBase64(licenseData)? e enviaria para o cliente este arquivo?

    dai pra frente o que não ficou claro pra mim como proceder para no aplicativo fazer uso da licença ( validar.... ) ele tem classes ApplicationStartupManager.java acredito que esta seja a classe singleton e ao fazer a carga do meu sistema devo chamar o startup(), até ai ta claro pra mim, mais o uso das outras classes, ClientSoftwareStartupManager.java, LicenseUsageService.java .....

    Eu penso que se tivesse um sisteminha de exemplo seria 10, poderias ajudar nesta parte?
    outra coisa sera que com o Java 8, 9 esta lib estaria valida?

    Obrigado

    ResponderExcluir

Postar um comentário