1 Star 0 Fork 8

Emotion404 / DLicense

forked from 任鑫 / DLicense 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README-bak.md 5.83 KB
一键复制 编辑 原始数据 按行查看 历史
任鑫 提交于 2021-06-08 16:51 . 转换图片后再展示

DLicense

基于开源 truelicense框架二次开发,依据业务场景设计抽象,提供整合SpringBoot的模块

介绍

基于springboot构建的应用证书授权验证服务

数字证书

入门博客参考

数字证书
代码如诗-数字证书

使用java命令行生成密钥库

依赖jdk的keytool命令

  1. 生成私钥库:
keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "renxin123" -keypass "renxin123" -dname "CN=cnrxmind, OU=rxmind, O=hy, L=HZ, ST=ZJ, C=CN"

命令参数说明:

参数 说明 备注
keysize 生成密钥长度 请务必设为1024
validity 密钥有效期(单位:天) 生成证书时证书有效期不应大于密钥有效期
alias 私钥别名
keystore 生成私钥库的文件名
storepass 私钥库口令 必须为小写字母和数字组合,否则程序校验不通过
keypass 密钥口令 保持与私钥库口令一致,否则解密证书会出现问题
dname 密钥的Distinguished name 程序生成证书会用到
  1. 导出公钥证书文件
keytool -exportcert -alias "privateKey" -keystore "privateKeys.keystore" -storepass "renxin123" -file "certfile.cer"

命令参数说明:

参数 说明 备注
alias 私钥别名
keystore 上一步生成的私钥库的文件名
storepass 私钥库口令 上一步设置的私钥库文件名
file 导出后的的公钥证书文件名
  1. 将公钥证书导入公钥库
keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "renxin123"

命令参数说明:

参数 说明 备注
alias 公钥别名
file 要导入的公钥文件
keystore 要导入的公钥库的文件名
storepass 公钥库口令,保持与第一步设置的私钥库口令一致,否则证书安装将不通过

工程简介

  1. 工程结构
    使用springboot2.2.10构建web工程
  • DLicense 父工程,抽取公共依赖

  • license-core 核心抽象接口与完整的证书生成/校验功能

  • license-server 授权证书颁发、证书解码、公钥下载、内网检测

  • license-starter 整合springboot

  • keystore 示例工程默认使用的密钥库文件

使用说明,如何为应用接入证书校验功能

  1. license-server 下载公钥
  2. license-server 生成证书
  3. 引入starter模块
  4. (可选)用户模块注入自定义证书读取器
生成密钥库

按前述步骤生成两个密钥库文件privateKeys.keystore和publicCerts.keystore,详细记录相关参数。

使用license-server工程生成证书
  1. 将私钥库文件 privateKeys.keystore 拷贝到classpath:/license/privateKeys.keystore
  2. 将公钥库文件 publicCerts.keystore 拷贝到 classpath:/license/publicCerts.keystore
  3. 启动工程,按接口文档(host:port/doc.html)提示创建并下载生成的证书和公钥文件,保存待用
    注意!务必仔细阅读接口文档
License-use-example工程为证书校验使用示例

该工程是一个示例工程,用以指导为应用程序引入证书校验功能。

license-core模块抽取公共抽象及基本实现

该模块功能主要是有:

  • 证书服务端证书生成功能

    • DLicenseCreator 接口提供了证书生成功能
    • DServerLicenseManagerDLicenseCreator 实现
  • 证书客户端证书校验功能

    • DClientLicenseInstaller 接口提供了证书安装和校验器添加功能
    • AbstractClientLicenseManager 客户端证书管理器,组合了一批校验器,实现证书安装、校验器执行、证书内容获取、校验结果通知功能
    • ScheduleValidateClientLicenseManager 周期性执行校验逻辑的客户端证书管理器
  • 校验器抽象:

    • cn.rxmind.dlicense.core.validator 为校验器抽象接口 *·AbstractExitJVMLicenseValidator 抽象类,这种校验器当校验不通过时会退出虚拟机,core中有以下子类
      • IPAddressLicenseValidator IP 地址校验器
      • LicenseActiveTimeValidator 证书有效期校验器
      • SubSiteCodeLicenseValidator 子站编码校验器
      • MacAddressLicenseValidator MAC 地址校验器
  • *Rule 校验规则抽象,具体的校验规则,都是JDK Predicate 的实现

    • ActiveTimeRule 激活时间规则
    • IncludeAndExcludeRule 包含/排除 规则

使用过程中其他问题

Q1
为什么将私钥库密码、公钥库密码、私钥密码设为一致且必须为小写字母和数字组合?
A1
公私密钥库密码不统一将导致证书文件解密失败,这个坑很大,因为异常信息是在jdk解密工具包抛出,很难联想到需要公私钥库不统一。
Q2
如何扩展校验逻辑?
A2
可以通过扩展cn.rxmind.dlicense.core.validator 的实现来扩展新的校验逻辑 Q3
为什么限制扩展参数长度?
A3
所有校验参数最终都被truelicense框架序列化为xml字符串,经过私钥加密生成证书文件,使用证书时需要以字节数组形式读入证书文件,truelicense框架限制最大读入1024*1024大小的证书文件,
非对称加解密本身消耗系统资源比较大,因此不建议使用太庞大的扩展参数最终导致证书文件过大。 Q4 如何修改证书读取方式? A4 core 中抽象出了证书读取器接口 LicenseBytesReader, 在 license-starter 中组合进证书管理器中,用户可通过实现该接口并注册到spring容器中实现替换

Java
1
https://gitee.com/Emotion404/dlicense.git
git@gitee.com:Emotion404/dlicense.git
Emotion404
dlicense
DLicense
master

搜索帮助