前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TrueLicense实现微服务商用授权方案设计

TrueLicense实现微服务商用授权方案设计

作者头像
可为编程
发布2024-07-10 14:22:03
1280
发布2024-07-10 14:22:03
举报
文章被收录于专栏:技术专栏全家桶

License,即版权许可证,一般用于收费软件给付费用户提供的访问许可证明。程序在对外提供服务时难免会因为一些合作的时间和合作的内容对程序进行一些限制,比如使用两年,两年之后需要重新找程序提供商对程序进行续签,或者是某些功能禁用,禁止特定人员访问等等,这些都是软件商用授权License版权许可证中设置的内容,区别于权限管理,版权许可证是在程序交付的时候对程序的一个约束,对程序开发公司来说是一种保护和持续盈利的手段。

关注可为,记录知识,传递价值。

概述

为了增强对外平台微服务的安全性,扩大平台在使用过程中的安全校验范围,同时保障平台服务中在线人数与车辆数不超过指定阈值,因此引入License文件进行自定义参数配置,使其能够支持对平台在线人数与车辆数等自定义参数的配置操作,平台校验License文件中所设置的生命时长与限制规则,保障安全性的同时,读取自定义参数并与当前平台的实际值进行校验,扩大平台管控范围与授权指标,提升License文件控制的灵活性。

License授权文件可以由不同平台具有权限的管理员对授权方式在系统中进行配置,包括根据时限进行授权,根据同时在线账户/终端数里进行授权,根据设备唯一标识进行授权。当授权到期、同时在线超额、非授权部署时,提前进行友好提示,达到条件后自动停止服务。这些都是由最高权限管理员进行配置,在本公司中单独出了一个license配置模块。

本次就重点讲一下当时我是如何进行设计和具体应用的。 关注公众号【可为编程】回复【加群】进入技术交流群一起学习成长!!!

1、现有技术基础

License,即版权许可证,一般用于收费软件给付费用户提供的访问许可证明。目前公司采用应用部署在客户内网环境的方案。在启动和登录请求发生时校验License证书的有效性并使用自定义参数值进行校验(在线车辆数、登录用户信息等)。

TrueLicense是一个开源的证书管理引擎,使用TrueLicense来做软件产品的保护,基于TrueLicense实现产品License验证功能,给产品加上License验证功能,进行试用期授权,在试用期过后,产品不再可用。同时TrueLicense可以设置自定义参数信息,支持整合SpringBoot工程进行自定义开发。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

2、系统方案设计

TrueLicense实现License授权与自定义参数认证逻辑共分成以下四个步骤:

1、生成公私钥对:采用java自带的证书生成工具KeyTool进行生成。

2、生成license证书许可文件:公司使用安全认证管理平台保留私钥,使用私钥对包含授权信息(如使用截止日期,MAC地址、在线用户数、终端数量)等License信息进行数字签名并生成license.lic证书许可文件。

3、安装使用:公钥及license.lic文件安装部署至平台,用于验证系统是否符合使用条件(过期、用户数、白名单、在线用户,Mac地址,CPU信息等等)。

内部加载逻辑

平台启动后,用户登录请求平台进行业务操作,首先会解析license许可证文件,看白名单中是否有对应用户的组或者是角色或者是部门(这个可以根据不同的情况而设定)用户判定通过后进行后续业务操作。

首先用户的每次请求都会经过统一的业务认证检测过滤器对License许可证进行有效性检测。

检测函数首先从公共缓存中间件Redis中获取在线用户数量和终端数量并从License文件中提取预先设置好的在线用户数和终端数并与Redis中存储的用户数量与终端数量进行比对,校验在线用户数量时,检测是否超出License中的设定值,如果超出设定值跳转登录页并提示用户已超出设定值。校验终端数量时,车端链接平台鉴权时读取License中终端数量的设定值,并与Redis中的真实值进行比较,如果超出设定值平台提示该车辆鉴权失败。具体的系统结构图如下所示:

系统结构图主要分为以下几大部分:

1、KeyTool工具密钥生成模块:用于生成私钥和公钥。生成指令执行后,会在当前路径下生成三个文件,分别是:privateKeys.keystore、publicCerts.keystore、certfile.cer。其中文件certfile.cer不再需要可以删除,文件privateKeys.keystore用于生成license文件,而文件publicCerts.keystore则随应用代码部署到矿区服务器,用于解密license文件并校验其许可信息。这就就是遵循私钥加签公钥验签的原理

2.License生成模块:用于生成license证书。

3.平台证书检测模块:导入license文件,并对请求进行拦截和校验。

4.数据模块:用于读取平台运行数据并与license设定数据进行校验比对。

具体的License执行时序图如下所示。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

关注公众号【可为编程】回复【加群】进入技术交流群一起学习成长!!!

3、方案实现

1、LicenseCreate生成lincense

使用LicenseCreate来生成需要的数字签名,配置文件简要说明如下:

PRIVATEALIAS:对应生成的私匙库名称别名alias privatekey

KEYPWD:该密码生成密钥对的密码,生成密钥对时录入的密码

STOREPWD:该密码是在使用keytool生成密钥对时设置的密钥库的访问密码

SUBJECT:生成的签名主题

licPath:生成的签名文件存放路径

priPath:使用的私匙库文件路径

同时可以对签名文件设置自定义内容配置,扩展签名文件中的自定义字段

在LicenseContent 中存在方法content.setExtra(new Object()),可以存储扩展的字段,校验时读取该信息即可。如果请求成功,那么最后会在 licensePath 参数设置的路径生成一个license.lic的文件,这个文件就是给客户部署代码的服务器许可文件。

2、LicenseVerify验证License

TrueLicense的de.schlichtherle.license.LicenseManager类自带的verify方法只校验了我们后面颁发的许可文件的生效和过期时间,然而在实际项目中我们可能需要额外校验应用部署的服务器的IP地址、MAC地址、CPU序列号、主板序列号等信息,因此我们需要复写框架的部分方法以实现校验自定义参数的目的。

校验配置文件简要说明如下:

PUBLICALIAS:对应生成的公匙库别名alias publiccert

STOREPWD:该密码生成密钥对的密码,生成密钥对时录入的密码

SUBJECT:校验的签名主题

licPath:校验的License文件存放路径

pubPath:使用的公匙库文件路径

扩展字段校验时采用重写VerifyLicense类中的verify()方法,并对自定义属性进行校验。在平台启动的时候安装License证书并添加拦截器,用于在登录的时候校验License证书。

3、子系统接口设计

为了实现本方案中的功能,各子系统/产品需要修改登录接口,读取在线和终端设备数据接口以及Redis数据存储接口。

4、技术指标

通过配置License商用授权许可证书文件,公司对矿区现场平台的使用进行指标限制,同时满足对平台使用期限、服务器唯一编号、在线用户数、终端数等指标的校验与认证,保障平台使用的安全性,提升商用价值。

1.1 运行场景描述

1、校验在线用户数量,检测在线用户数是否超出License中约定的最大在线用户数量,如超出最大值则跳转登录页并提示用户已超出在线用户数量最大值,不允许用户登录。

2、校验终端数量,车端链接平台进行鉴权时读取License中约定的终端数量的最大值,并与Redis中的真实值进行比较,如果超出最大值平台提示该车辆鉴权失败。

3、校验平台服务启动参数,License许可文件中配置的服务器唯一标识是否与当前部署所采用的服务器唯一标识一致,如一致平台服务启动成功,不一致则启动失败,打印启动日志信息到日志文件。这个启动标识初步定义为产品版本号V130C00P01。

4、校验平台有效期,License授权许可证书文件配置平台使用期限,平台启动校验平台是否在可用期限范围,同时页面显示可用时长。如平台未启动且超出可用期限范围提示系统不可用并禁止平台启动,如平台已启动且超出可用期限范围则跳转登录页并提示平台已过期。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

关注公众号【可为编程】回复【加群】进入技术交流群一起学习成长!!!

后面还可以加一些自定义的一些配置信息的解析校验逻辑,比如CPU、MAC地址、IP地址等信息。

如上图所示,整体架构主要分成五层技术架构,第一层为前端层,需要对后端许可证前端消息进行回传与展示。

第二层为车端和平台微服务层。车端启动时与平台进行鉴权校验,并判断是否超出License文件配置的终端数量,若超出,车端启动失败。

第三层为License签发层。主要为License商用许可证生成服务,后续该功能将由安全认证管理平台进行。通过ToolKey生成私钥和公钥,并将私钥作为License生成参数,为平台服务层提供证书。

第四层为缓存层。缓存层采用Redis组件实现,读取数据库并存储用户在线人数和终端数量信息。

第五层为数据层。读取PostgresSQL数据库,并将数据存入到Redis缓存中。

4、方案架构

架构图中主要分为四大模块(点击下图预览原图):

1、License许可证参数生成模块

License许可证生成模块主要采用两种形式进行公私钥文件签发,一种是采用公司EJBCA根据各个矿区签发不同子CA,公司保留唯一根CA与子CA证书,然后根据子CA再签发各个矿区的公私钥对,最终拿到私钥作为请求参数去生成License证书文件,公钥随License证书文件一同部署到矿区服务器。第二种是手动执行Shell脚本生成公私钥对,该形式主要依赖Java原生工具KeyTool生成公钥、私钥和加密证书文件。利用生成的密钥和获取到的服务器信息数据作为签发License商用许可证的前提条件。 2、License许可证签发生成模块

通过参数生成模块后,将生成和收集好的数据信息封装成JSON格式字符串,作为License许可证文件的请求参数。同时License生成模块作为安全认证管理平台微服务中的子系统,可以支持生成不同平台、不同限制信息的License商用授权文件,避免了与原平台程序的耦合。该微服务作为公司内部的服务,无需部署到现场矿区,同时可对外提供Feign调用接口,其他平台可以通过远程调用,请求接口并进行License签发。

3、平台微服务校验模块

基于此次开发的需求,License签发子系统将解析License证书逻辑与安装License证书等逻辑进行封装,封装为可导入的jar包形式,调度平台等其他平台可以直接以引用pom坐标的形式进行工程整合,直接调用封装好的License校验包中的相关接口解析获取License证书信息并与平台实际数据进行后续逻辑校验。

平台微服务校验模块主要分为三大部分:平台启动鉴权与校验、校验在线用户数、车辆启动鉴权与校验。

(1)平台启动鉴权逻辑是在平台启动时,对所部署的服务器信息进行校验,主要包括但不限于Linux主板号、MAC地址、CPU等信息,同时还可灵活自定义其他相关启动参数。如所在服务器与License许可证中所限制的参数不匹配时,启动失败,并将失败信息记录到日志文件。

(2)车辆启动鉴权校验是在车辆启动时对License中约定的终端数量与实际获取到的车辆终端数量进行鉴权,如果实际车辆数量加上当前启动车辆数量总和小于License中约定的终端数量,则允许该车辆启动。否则启动失败,平台提示该车鉴权失败消息信息。

(3)校验在线用户数量,检测在线用户数是否超出License中约定的最大在线用户数量,如超出最大值则跳转登录页并提示用户已超出在线用户数量最大值,不允许用户登录。

(4)校验平台有效期,License授权许可证书文件配置平台使用期限,平台启动校验平台是否在可用期限范围,同时页面显示可用时长。如平台未启动且超出可用期限范围提示系统不可用并禁止平台启动,如平台已启动且超出可用期限范围则跳转登录页并提示平台已过期。

4、数据汇聚模块

数据汇聚模块主要提供实时在线人数和车辆终端数据信息,与License许可文件中所限制的参数进行校验。

5、部署架构图

部署结构图主要分为公司内网和现场内网两个维度。

公司内网部署license安全认证平台,安全认证平台对License商用许可证文件进行管理,并将不同阶段生成的许可证文件存储到MINIO资源服务器中,便于后续用户下载与配置到其他微服务当中进行部署整合。

后面就涉及太多的一些业务相关的东西,就不过多进行描述,到这里已经将License认证与鉴权的逻辑全部汇总阐述了一边,其实方案设计到这里就没问题了,后面就是出概要设计进行下一步评审和开发了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可为编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档