SpringBoot整合TrueLicense生成和验证License证书

简介: TrueLicense生成和验证License证书

一 License介绍

License,也就是版权许可证书,一般用于收费软件给付费用户提供的访问许可证明。根据应用部署位置的不同,一般可以分为以下几种情况讨论:

  • 应用部署在开发者自己的云服务器上。这种情况下用户通过账号登录的形式远程访问,因此只需要在账号登录的时候校验目标账号的有效期、访问权限等信息即可。
  • 应用部署在客户的内网环境。因为这种情况开发者无法控制客户的网络环境,也不能保证应用所在服务器可以访问外网,因此通常的做法是使用服务器许可文件,在应用启动的时候加载证书,然后在登录或者其他关键操作的地方校验证书的有效性(本文介绍的就是这种)。
  • 应用部署到客户现场,但是客户服务器可以联网,那就可以采用颁发许可证书进行验证,也可以远程认证-认证服务器提供认证请求,必须走线上认证才可使用。

注意:任何加密都有反编译、破解、跳过的手段。

license授权机制的原理
TrueLicense是一个开源的证书管理引擎。

  1. 生成密钥对,使用Keytool生成公私钥证书库。
  2. 授权者保留私钥,使用私钥对包含授权信息(如使用截止日期,MAC地址等)的license进行数字签名。
  3. 公钥给使用者(放在验证的代码中使用),用于验证license是否符合使用条件。

项目源代码地址:https://www.aliyundrive.com/s/2zzpRqTC988

二 实战

2.1 服务端代码

使用Keytool生成公私钥证书库

假如我们设置公钥库密码为:public_password1234,私钥库密码为:private_password1234,则生成命令如下(按顺序执行下边的三条命令即可):

## 1. 生成私匙库
# validity:私钥的有效期多少天
# alias:私钥别称
# keystore: 指定私钥库文件的名称(生成在当前目录)
# storepass:指定私钥库的密码(获取keystore信息所需的密码) 
# keypass:指定别名条目的密码(私钥的密码) 
keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "public_password1234" -keypass "private_password1234" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN"

## 2. 把私匙库内的公匙导出到一个文件当中
# alias:私钥别称
# keystore:指定私钥库的名称(在当前目录查找)
# storepass: 指定私钥库的密码
# file:证书名称
keytool -exportcert -alias "privateKey" -keystore "privateKeys.keystore" -storepass "public_password1234" -file "certfile.cer"

## 3. 再把这个证书文件导入到公匙库
# alias:公钥别称
# file:证书名称
# keystore:公钥文件名称
# storepass:指定私钥库的密码
keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "public_password1234"

在D盘新建一个license目录,在该目录下打开cmd窗口,执行上边第一个命令后,就会生成privateKeys.keystore文件,如下
image.png

再接着执行第二条命令,生成certfile.cer文件,如下
image.png

再接着执行第三条命令,生成publicCerts.keystore文件,如下

image.png

上述命令执行完成之后,会在当前路径下生成三个文件,分别是:privateKeys.keystore、publicCerts.keystore、certfile.cer。其中文件certfile.cer不再需要,可以删除,文件privateKeys.keystore用于当前的 license-server 项目给客户生成license文件,而文件publicCerts.keystore则随应用代码部署到客户license-client服务器,用户解密license文件并校验其许可信息。

把server程序部署到客户服务器上,获取客户端的信息
把license-server项目部署到用户服务器上,启动项目里的license-server端程序,然后访问如下接口http://localhost:8000/license/getServerInfos,获取客户部署服务器的cpu、ip、mac地址、主板序列号等等信息。当然,如果license里不校验用户服务器的这些信息的话,就没必要获取这些内容了。如license只对有效日期进行校验,则不需要访问这个接口获取用户的部署环境信息了。
image.png

生成license证书
在我们自己本地(不是客户服务器了),运行license-server项目,项目启动后,由于是post请求,只能通过postman访问接口,生成证书,请求地址:http://localhost:8000/license/generateLicense

头信息

image.png

body信息如下:
ip和mac是数组,可以写多个。licenseCheckModel里的内容,不校验的话可以不写
image.png

body如下
image.png

body:

{
   
   
        "subject": "license_demo",
        "privateAlias": "privateKey",
        "keyPass": "private_password1234",
        "storePass": "public_password1234",
        "licensePath": "D:/license/license.lic",
        "privateKeysStorePath": "D:/license/privateKeys.keystore",
        "issuedTime": "2023-04-10 00:00:01",
        "expiryTime": "2024-05-31 23:59:59",
        "consumerType": "User",
        "consumerAmount": 1,
        "description": "这是证书描述信息",
        "licenseCheckModel": {
   
   
            "ipAddress": [],
            "macAddress": [],
            "cpuSerial": "",
            "mainBoardSerial": ""
        }
    }

上边参数,各字段含义如下

{
   
   
        "subject": "license_demo",主题名,一般写项目名就行
        "privateAlias": "privateKey",私钥名称
        "keyPass": "private_password1234",私钥密码·
        "storePass": "public_password1234",证书校验的密码
        "licensePath": "D:/license/license.lic",要生成的证书路径
        "privateKeysStorePath": "D:/license/privateKeys.keystore",之前生成的文件的路径
        "issuedTime": "2023-04-10 00:00:01",证书开始生效的时间
        "expiryTime": "2024-05-31 23:59:59",证书有效期结束的时间
        "consumerType": "User",
        "consumerAmount": 1,
        "description": "这是证书描述信息",
        "licenseCheckModel": {
   
     下边这些内容可以为空,为空的话就不进行验证了,有值才会进行验证
            "ipAddress": [],ip地址(由于客户的ip会动态变化所以一般不设置ip校验)
            "macAddress": [],mac地址
            "cpuSerial": "",cpu序列号
            "mainBoardSerial": "" 主板序列号
        }
    }

调完接口后,会生成证书如下
image.png

生成上边的证书,也可以直接执行代码里提供的测试方法:
image.png

2.1 客户端代码验证证书

资料里的license-client项目,就是要部署在客户服务器上的项目。

把2.1章节里生成的license.lic文件,还有公钥文件,放到客户服务器指定目录,项目里指定的目录要与这个文件目录一致
image.png

启动项目测试
image.png

相关文章
|
7月前
|
前端开发 安全 Java
SpringBoot验证框架@Valid
SpringBoot验证框架@Valid
84 1
|
7月前
|
JSON 前端开发 Java
SpringBoot 的优雅的接口参数验证
1. 为什么需要参数验证 在应用程序的开发中,我们经常会遇到需要保证传入参数的正确性的情况。例如,当我们在注册用户时,需要验证用户填写的表单数据是否符合规范,是否缺少必填字段,或者格式是否正确,等等。如果不对参数进行验证,我们的应用程序可能会因此受到攻击或者运行出错。 为了保证参数的正确性,我们需要使用参数验证机制,来检测并处理传入的参数格式是否符合规范。 2. 如何进行参数验证 Spring Boot内置了一个很强大的参数验证框架——JSR 303 Bean Validation 标准,它可以对我们的实体类参数进行校验,并且可以给我们提供详细的错误提示信息。
146 1
|
2月前
|
JSON 安全 算法
|
2月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
418 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
4月前
|
SQL Java 数据库连接
springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
这篇文章介绍了在Spring Boot + MyBatis + Shiro项目中,如何使用Shiro框架实现登录用户的权限验证,包括用户、角色和权限表的设计,以及通过多个表查询来收集和验证用户权限的方法和代码实现。
springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
|
4月前
|
SQL 前端开发 Java
springboot项目中使用shiro实现用户登录以及权限的验证
这篇文章详细介绍了如何在Spring Boot项目中集成Apache Shiro框架来实现用户登录和权限验证,包括项目依赖配置、数据库连接、实体类定义、控制器、服务层、Mapper层以及前端页面的实现,并展示了实际效果和过滤器代码。
springboot项目中使用shiro实现用户登录以及权限的验证
|
4月前
|
安全 Java 关系型数据库
SpringBoot SpringSecurity 介绍(基于内存的验证)
SpringBoot SpringSecurity 介绍(基于内存的验证)
54 0
|
4月前
|
前端开发 Java
如何实现 Java SpringBoot 自动验证入参数据的有效性
如何实现 Java SpringBoot 自动验证入参数据的有效性
42 0
|
6月前
|
算法 Java API
在Spring Boot中实现接口签名验证通常涉及以下步骤
在Spring Boot中实现接口签名验证通常涉及以下步骤
532 4
|
5月前
|
Java 数据库连接 测试技术
在Spring Boot中实现数据校验与验证
在Spring Boot中实现数据校验与验证