springboot实现License证书的授权和许可到期验证

news2024/11/18 7:25:20

前言

在客户服务器部署软件项目后,为了项目版权管控或者对项目进行授权收费处理的,就需要实现项目的授权和许可验证。

在这里讲解的是使用 license证书 的形式实现授权和许可验证(已通过测试)。
主要是通过 IP地址、MAC地址、CPU序列号、主板序列号 服务器硬件信息生成一个License证书,同时可以设置生效时间与失效时间,控制项目到期之后项目不可用。

实现思路

license授权机制的原理

1、生成密钥对,包含私钥和公钥。
2、授权者保留私钥,使用私钥对授权信息诸如使用截止日期,mac 地址等内容生成 license 签名证书。
3、公钥给使用者,放在代码中使用,用于验证 license 签名证书是否符合使用条件。

实现流程

1、使用JDK自带的 keytool 生成密钥对(生成私钥和公钥两个文件)
2、License服务端获取服务器硬件信息
3、License服务器根据服务器硬件信息和私钥文件加密生成 License.lic 文件,也就是License证书。
4、License客户端安装License证书并生效和到期日期进行校验

实现步骤

一、使用KeyTool生成密匙对

1、自己本地随便找个位置创建一个文件夹,我这里创建了名为 License 的文件夹
在这里插入图片描述
2、进入到该文件中,在上面的路径中输入cmd并回车,会打开命令窗口
在这里插入图片描述
3、在命令窗口中依次输入以下命令

keytool -genkey -keysize 1024 -keyalg DSA -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "ljh521548" -keypass "ljh521548" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN"

# 导出命令
keytool -exportcert -alias "privateKey" -keystore "privateKeys.keystore" -storepass "ljh521548" -file "certfile.cer"
 
#导入命令
keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "ljh521548"

命令参数说明:

keysize 密钥长度
keyalg  加密方式 
validity 私钥的有效期(单位:天)
alias 私钥别称
keystore 指定私钥库文件的名称 (生成在当前目录)
storepass 指定私钥库的密码 (keystore 文件存储密码)
keypass 指定别名条目的密码 (私钥加解密密码)
dname 证书个人信息
CN 为你的姓名
OU 为你的组织单位名称
O 为你的组织名称
L 为你所在的城市名称
ST 为你所在的省份名称
C 为你的国家名称

在这里插入图片描述
然后可以看到以下三个文件:

privateKeys.keystore(私钥)提供给生成证书使用(自己保留)

publicCerts. keystore(公钥)提供给证书认证使用(给客户使用)

certfile.cer后续步骤用不到,可以删除。

其他可能使用到的命令

# 删除
keytool -delete -alias privateKey -keystore "privateKeys.keystore" -storepass "ljh521548"

# 查看
keytool -list -v -keystore zuiyuPrivateKeys.keystore -storepass "ljh521548"

二、License服务端获取服务器信息和生成License证书

源码:https://gitee.com/sshmily/license-service

1、启动后通过 /api/license/getServerInfos/{osName} 接口获取到服务器的硬件地址。
如果是windows系统osName参数就输入windows,Linux系统osName参数就输入Linux。
在这里插入图片描述
2、使用服务器的硬件信息和第一步生成的私钥生成License证书

使用 /api/license/generateLicense 接口生成证书。
在这里插入图片描述
请求参数示例

{
    "subject": "license_ljh", //主题名
    "privateAlias": "privateKey", //私钥别名
    "keyPass": "ljh521548", //私钥密码
    "storePass": "ljh521548", //密钥库密码
    "licensePath": "D:/License/license.lic", //生成证书的存储位置
    "privateKeysStorePath": "D:/License/privateKeys.keystore", //私钥的存储位置
    "issuedTime": "2022-12-09 00:00:00", //开始生效时间
    "expiryTime": "2099-12-09 00:00:00", //证书到期时间
    "consumerType": "user",  //用户类型
    "consumerAmount": 1, //用户数量
    "description": "这是证书描述信息", //描述信息
    "licenseCheckModel": {  //licenseCheckModel 第一步获取到的服务器硬件信息
        "ipAddress": [
            ""
        ],
        "macAddress": [
            ""
        ],
        "cpuSerial": "",
        "mainBoardSerial": ""
    }
}

三、客户端安装证书并校验时间

源码:https://gitee.com/sshmily/license-client

源码拿到本地后主要是修改yml文件配置即可,其他的代码都有说明

license:
  subject: license_ljh #主题名
  publicAlias: publicCert  #公钥别名
  storePass: ljh21548 #密钥库密码
  licensePath: D:/License/license.lic  #license证书存放位置
  publicKeysStorePath: D:/License/publicCerts.keystore  #公钥文件存放位置
  uploadPath: D:/LicenseDemo/

测试

1、证书过期

当证书过期的时候启动客户端控制台会提示 exc.licenseHasExpired 错误,说明证书已经过期的。
在这里插入图片描述
这个时候访问项目就会出现以下提示
在这里插入图片描述
在这里插入图片描述

2、证书有效

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

PyTorch - 线性回归

文章目录普通实现准备数据反向传播构建模型 实现实例化模型、损失函数、优化器训练数据评估模型普通实现 准备数据 import torch import matplotlib.pyplot as plt # 1、准备数据 # y 2 * x 0.8 x torch.rand([500, 1]) y_true 2 * x 0.8 # 2、通过模型计算 y_predict …

MyBatis面试题(2022最新版)

整理好的MyBatis面试题库,史上最全的MyBatis面试题,MyBatis面试宝典,特此分享给大家 MyBatis简介 MyBatis是什么? MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它…

Kotlin 开发Android app(二十一):协程launch

什么是协程,这可是这几年才有的概念,我们也不用管它是什么概念,先看看他能做什么。 创建协程 添加依赖: implementation org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9implementation org.jetbrains.kotlinx:kotlinx-cor…

DCDC电感下方铜箔如何处理

挖:电感在工作时,其持续变化的电流产生的电磁波会或多或少的泄露出来,电感下方的铜箔受电磁波影响,就会有涡流出现,这个涡流,①可能对线路板上的信号线有干扰,②铜箔内的涡流会产生热量&#xf…

申请阿里云域名SSL证书步骤

1.【点击登录】 阿里云 2.选择 DV单域名证书 3.确定购买,支付。 4.完成后,跳转回控制台。 5.点击 证书申请。 6.填写域名、申请人姓名、手机号、邮箱、所在地 7、选择域名验证方式,官方提供了三种验证方式,根据自身情况选择其中…

【Linux】Linux的常见指令详解(下)

目录 前言 head/tail 命令行管道 date sort cal 搜索指令 find which whereis alias grep zip tar file bc history 热键 前言 之前讲了Linux的常见指令详解(上),这次终于把下也补齐了。如果对你有帮助还麻烦给博主一个…

Netty_05_六种序列化方式(JavaIO序列化 XML序列化 Hessian序列化 JSON序列化 Protobuf序列化 AVRO序列化)(实践类)

文章目录一、普通的序列化方式(bean对象有直接的java类)1.1 普通的java io byteArray输入输出流的序列化方式1.2 xml序列化方式(xml用来做配置文件,这样序列化出来长度很大)1.3 Hessian序列化方式(这个Dubbo中使用的序列化方式&am…

flask前后端项目--实例-前端部分:-3-vue基本配置

一、基本配置以及验证 1.基础环境:nodejs的安装配置以及注意事项 https://blog.csdn.net/wtt234/article/details/128131999 2.vue使用vite创建文件包的过程 创建项目 npm init vitelatest 根据提示一步步选择: 选择vue 进入项目目录,安装…

【计算机网络】网络层:IPV6

IPV4耗尽,使用具有更多地址空间的IPV6 IPV6特点: (1)IPV6地址128位,更大地址空间,可以划分位更多的层次 (2)IPV6定义许多拓展首部,可提供更多功能,但IPV6首部长度固定,选项放在有效载荷中 (…

打败阿根廷的究竟是谁

2022年卡塔尔世界杯正在如火如茶的进行着。在今年的世界杯中,有两个令人意外的点,一个是日本队击败的德国队,另外一点是沙特队战胜了实力强盛的阿根廷队。 有人说打败阿根廷队的不是沙特队,而是科技------"半自动越位"技…

某Y易盾滑块acToken、data逆向分析

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 目标 网址:案例地址 这个好像还没改版,我看官网体验那边已经进行了混淆 只研究了加密的生成,环境不正确可能会导致的加密结果对 (太累了,先缓缓吧,最近事比…

创建Mongo官方的免费数据库并使用VSCode连接

注册账号 https://cloud.mongodb.com/ 在这个平台注册账号,并登录 创建数据库 选择shared,其他要收费 导入样本数据 导入后会发现数据中多了很多sample数据,用于练习 创建访问用户 允许任何地址访问 如果需要任何IP地址都能访问&#xff…

Qt-数据库开发-用户登录、后台管理用户(6)

Qt-数据库开发-使用QSqlite数据库实现用户登录、后台管理用户功能 文章目录Qt-数据库开发-使用QSqlite数据库实现用户登录、后台管理用户功能1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容👉个人内容分类汇总 👈👉数据库开发 &…

UG环境设置

UG环境设置UG设置工作路径默认设置方法1: 修改快捷键路径方法2:修改“用户默认设置”UG设置窗口标题效果方法注意设置十字准线效果设置方法角色设置窗口布局效果方法命令搜索UG设置工作路径 默认设置 打开NX软件,新建模型默认路径如下&…

代码随想录算法训练营第三天| 链表理论基础, 203.移除链表元素,707.设计链表,206.反转链表

代码随想录算法训练营第三天| 链表理论基础, 203.移除链表元素,707.设计链表,206.反转链表 链表理论基础 建议:了解一下链接基础,以及链表和数组的区别 文章链接: 203.移除链表元素 建议: 本…

智源社区AI周刊No.109:ChatGPT预示大模型取代搜索引擎;Stable Diffusion2.1发布,8k高清图像生成...

汇聚每周AI热点,不错过重要资讯!欢迎扫码,关注并订阅智源社区AI周刊。ChatGPT火出圈:对话大模型驱动新型搜索范式诞生,或将取代搜索引擎火出圈的ChatGPT注册用户数量已超过五百万,无疑是2022年最火的AI模型…

ReactNative MacOS环境初始化项目(安卓)

MacOS 12.6.1 官方文档 英文 https://reactnative.dev/docs/environment-setup中文 https://www.react-native.cn/docs/environment-setup 相关文档 ReactNative MacOS环境初始化项目(ios)OpenJDK 与 AdoptOpenJDK 的区别 安装步骤 安装Homebrew - /bin/zsh -c "$(curl -f…

spring学习记录(七)

Spring中对象分类 Spring是一个功能强大的容器,容器中存储的是一个一个的对象,容器中的对象分为: 简单对象复杂对象 简单对象就是可以通过构造器直接new 出来的对象; 复杂对象是不可以直接通过构造器直接new出来的对象。 无论是…

[附源码]Python计算机毕业设计SSM基于课程群的实验管理平台(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Java中异常处理方式

文章目录针对异常的处理主要有两种方式:1.抛出异常2.try catch 捕获异常三道经典异常处理代码题针对异常的处理主要有两种方式: 1.抛出异常 遇到异常不进行具体处理,而是继续抛给调用者(throw,throws)抛出…