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

news2024/9/25 3:27:54

一 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文件,如下
在这里插入图片描述
再接着执行第二条命令,生成certfile.cer文件,如下
在这里插入图片描述
再接着执行第三条命令,生成publicCerts.keystore文件,如下

在这里插入图片描述
上述命令执行完成之后,会在当前路径下生成三个文件,分别是: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只对有效日期进行校验,则不需要访问这个接口获取用户的部署环境信息了。
在这里插入图片描述

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

头信息

在这里插入图片描述
body信息如下:
ip和mac是数组,可以写多个。licenseCheckModel里的内容,不校验的话可以不写
在这里插入图片描述
body如下
在这里插入图片描述
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": "" 主板序列号
		}
	}

调完接口后,会生成证书如下
在这里插入图片描述
生成上边的证书,也可以直接执行代码里提供的测试方法:
在这里插入图片描述

2.1 客户端代码验证证书

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

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

启动项目测试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon——在C#中各数据类型的相互转换

Halcon——在C#中各数据类型的相互转换 前言一、HObject to1.HObject to HImage 二、HTuple to1.HTuple to Int2.HTuple to Double3.HTuple to String4.HTuple to long5.HTuple to object6.HTuple to Arr 总结 前言 用c#进行Halcon代码转换的时候,虽然有halcon自带…

Python基础语法-梳理的几个知识点

1.书写格式 不需要声明变量类型,因为 在python中,变量为弱类型变量,Python解析器根据值自动匹配变量类型分支结构、循环结构中的条件表达式,不需要用小括号括起来执行语句体不需要大括号括起来,而是用冒号代替 2.格式…

GRNN神经网络原理与matlab实现

1案例背景 1.1GRNN神经网络概述 广义回归神经网络(GRNN Generalized Regression Neural Network)是美国学者 Don-ald F. Specht在1991年提出的,它是径向基神经网络的一种。GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问…

使用 JMeter 进行压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率;预估系统的承载能力,使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

套接字通信(C/C++ 多线程)----基于线程池的并发服务器

(一)大家可以看我写的这三篇,了解一下: 基于linux下的高并发服务器开发(第四章)- 多线程实现并发服务器_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://blog.csdn.net/weixin_4198701…

Jmeter如何添加插件

一、前言 ​ 在我们的工作中,我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件? 2023最新Jmeter接口测试从入门到精通(全套项目实战教程) 二、插件管理器 ​ 首先我们需要下载插件管理器j…

一个完整的http请求响应过程

一、 HTTP请求和响应步骤 图片来自:理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型(Transmission Control Protocol/Internet Pr…

04、并发用户数该怎么计算

什么是并发? 我们假设上图中的这些小人是严格按照这个逻辑到达系统的,那显然,系统的绝对并发用户数是 4。如果描述 1 秒内的并发用户数,那就是 16。是不是显而易见?但是,在实际的系统中,用户通常…

若依框架 - 对二次封装数据分页

LsDistrictController /*** 查询地段列表*/ApiOperation("查询地段列表")GetMapping("/list")public TableDataInfo list(LsDistrict lsDistrict) {startPage();Map<String, List> map lsDistrictService.selectLsDistrictList(lsDistrict);if (Col…

java类和对象详解(1)

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program, 简称OOP),在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。 用面向对象的思想来涉及程序&#xff0c;更…

AntdesignVue 时间设置为年份不回显问题解决

时间设置为年份回显时报如下错误 年份设置值后报value异常 解决方案 格式不一致导致的 moment格式化后是string类型&#xff0c;后台返回的是Number类型导致的&#xff0c;统一格式就会显示了

人工智能安全-3-噪声数据处理

0 提纲 噪声相关概述噪声处理的理论与方法基于数据清洗的噪声过滤主动式过滤噪声鲁棒模型1 噪声相关概述 噪声类型: 属性噪声:样本中某个属性的值存在噪声标签噪声:样本归属类别关于噪声分布的假设:均匀分布、高斯分布、泊松分布等。 标签噪声的产生原因: (1)特定类别…

Unity 引擎做残影效果——1、BakeMesh

Unity实现残影效果 大家好&#xff0c;我是阿赵。   这次来分享一下在Unity里面做残影的效果。   所谓的残影&#xff0c;就是在角色移动的过程中&#xff0c;留下一串残留的影子。 这种效果比较常出现在格斗游戏和动作游戏。   在Unity里面做残影&#xff0c;方法很多…

DSPM来袭!什么是数据安全态势管理

数据安全态势管理是一种保护云数据的方法&#xff0c;通过确保敏感数据始终具有正确的安全态势&#xff0c;无论其被复制或移动到何处。 那么&#xff0c;什么是DSPM&#xff1f;这是一个简单的例子&#xff1a; 假设您已经为云数据建立了出色的安全态势。在此示例中&#xf…

力扣 96. 不同的二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/unique-binary-search-trees/description/ C题解&#xff1a;动归五部曲。 确定dp数组以及下标的含义。dp[i] &#xff1a; 1到i为节点组成的二叉搜索树的个数为dp[i]。确定递推公式。由于是二叉搜索树&#xff0c;我们可以…

vue实现 图片拖拽及鼠标滚轮放大缩小

效果&#xff1a; 代码实现 <template><div class"container"><divclass"image-container"mousewheel.stop"onMouseWheel"mousedown"onMouseDown"mousemove"onMouseMove"mouseleave"onMouseLeave&quo…

大文件传输的有效可用方式

如何传输大文件&#xff1f;大文件传输的方法有哪些&#xff1f;在互联网时代&#xff0c;速度就是效率。企业在生产过程中需要进行数据信息的交换、转移。这就涉及到大文件的传输。不同的行业都有大文件传输的需求。比如影视行业需要每天传输视频素材&#xff0c;一个视频可能…

第十三章 利用PCA简化数据

文章目录 第十三章 利用PCA简化数据13.1降维技术13.2PCA13.2.1移动坐标轴 13.2.2在NumPy中实现PCA13.3利用PCA对半导体制造数据降维 第十三章 利用PCA简化数据 PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种常用的降维技术&#xff0…

Error in v-on handler (Promise/async): “[object Object]“

解决方法&#xff1a;用try 和 catch 语句来处理 catch来接收try异常报错

Linux怎么设置软链接(ln命令)

在Linux中&#xff0c;软链接&#xff08;Symbolic Link&#xff09;&#xff0c;它可以指向另一个文件或目录。类似于Windows中的快捷方式。 主要作用&#xff1a;文件路径简化&#xff1a;通过创建软链接&#xff0c;可以将长而复杂的文件路径简化为一个易于记忆和使用的链接…