参考博主
想养一只!
https://blog.csdn.net/weixin_45151960/article/details/128262535
在客户服务器部署软件项目后,为了项目版权管控或者对项目进行授权收费处理的,就需要实现项目的授权和许可验证。
在这里讲解的是使用 license证书 的形式实现授权和许可验证(已通过测试)。
主要是通过 IP地址、MAC地址、CPU序列号、主板序列号 服务器硬件信息生成一个License证书,同时可以设置生效时间与失效时间,控制项目到期之后项目不可用
详解
1、生成密钥对,包含私钥和公钥。
2、授权者保留私钥,使用私钥对授权信息诸如使用截止日期,mac 地址等内容生成 license 签名证书。
3、公钥给使用者,放在代码中使用,用于验证 license 签名证书是否符合使用条件。
1、使用JDK自带的 keytool 生成密钥对(生成私钥和公钥两个文件)
2、License服务端获取服务器硬件信息
3、License服务器根据服务器硬件信息和私钥文件加密生成 License.lic 文件,也就是License证书。
4、License客户端安装License证书并生效和到期日期进行校验
我使用的服务器是LINUX,debian10操作系统,mvn clean package 首先build,然后java -jar启动jar包
java -jar license-service.jar
## 1. 生成私匙库
# validity:私钥的有效期多少天
# alias:私钥别称
# keystore: 指定私钥库文件的名称(生成在当前目录)
# storepass:指定私钥库的密码(获取keystore信息所需的密码)
# keypass:指定别名条目的密码(私钥的密码)
keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "public_password123456" -keypass "private_password123456" -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_password123456" -file "certfile.cer"
## 3. 再把这个证书文件导入到公匙库
# alias:公钥别称
# file:证书名称
# keystore:公钥文件名称
# storepass:指定私钥库的密码
keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "public_password123456"
{
"subject": "license_demo",//主题名
"privateAlias": "privateKey",//私钥别名
"keyPass": "private_password123456",//私钥密码
"storePass": "public_password123456",//密钥库密码
"licensePath": "/opt/license.lic",//生成证书的存储位置
"privateKeysStorePath": "/opt/privateKeys.keystore",//私钥的存储位置
"issuedTime": "2023-09-09 00:00:00",//开始生效时间
"expiryTime": "2099-12-09 00:00:00",//证书到期时间
"description": "这是证书描述信息",
"licenseCheckModel": { //licenseCheckModel 第一步获取到的服务器硬件信息
"ipAddress": [
""
],
"macAddress": [
""
],
"cpuSerial": "",
"mainBoardSerial": ""
}
}
# 使用 OpenJDK 8 镜像作为基础镜像
FROM openjdk:8-jre
# 维护者信息
MAINTAINER aike
# 创建应用程序目录并确保 /opt 存在
RUN mkdir -p /opt && mkdir -p /mydata
# 复制你的 Java 应用程序 JAR 文件到容器
COPY target/license-service.jar /opt/app.jar
# 暴露应用程序的端口
EXPOSE 8000
docker build -t my-java-app:1.0 . 制作镜像
version: '3'
services:
license-service:
image: my-java-app:1.0
container_name: license-service
ports:
- "8000:8000"
volumes:
- /mydata/license-service/key:/mydata
docker compose up -d 启动
这里解释一下,因为这个加密JDK11加密有问题,必须使用JDK8所以才制作的镜像,这里有俩种办法解决,
1:是直接把生成证书的指令添加到Dockerfile里面,这样会增加体积
2:是进入到容器里面执行添加
## 1. 生成私匙库
# validity:私钥的有效期多少天
# alias:私钥别称
# keystore: 指定私钥库文件的名称(生成在当前目录)
# storepass:指定私钥库的密码(获取keystore信息所需的密码)
# keypass:指定别名条目的密码(私钥的密码)
keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "public_password123456" -keypass "private_password123456" -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_password123456" -file "certfile.cer"
## 3. 再把这个证书文件导入到公匙库
# alias:公钥别称
# file:证书名称
# keystore:公钥文件名称
# storepass:指定私钥库的密码
keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "public_password123456"
宿主机也会存在
查看宿主机