# license **Repository Path**: yanwc/license ## Basic Information - **Project Name**: license - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-18 - **Last Updated**: 2025-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目结构说明 ``` ├── cmd │ └── generator │ ├── licensegen │ ├── rsagen │ └── rsagenscript ├── exmaple │ └── main.go ├── go.mod ├── go.sum ├── internal │ └── validator │ ├── license_check.go │ ├── ntp_client.go │ └── time_validator_config.go ├── pkg │ └── validator │ ├── license_validator.go │ └── time_validator.go └── README.md ``` ## cmd/generator/licensegen ​​软件许可证签发工具​​。它的核心功能是使用 RSA 私钥对包含授权信息的许可证文件进行数字签名,生成一个不可篡改的许可证文件(license.lic)。这个文件可以与pkg/validator提供的验证器配套使用。 - out 目录是许可证输出路径 license.lic ## cmd/generator/rsagenscript 执行脚本openss.sh 生成PCKS#1格式的公钥和私钥 ``` ./openssl.sh ``` ## cmd/generator/rsagen rsagen main.go 也可以生成PCKS#1格式的公钥和私钥 ## pkg/validator 这是一个用于验证软件许可证有效性的模块。其核心工作原理是:使用 ​​RSA-PSS 数字签名​​ 来确保许可证文件 sequenceDiagram participant A as 应用程序 participant L as LicenseValidator participant F as 文件系统 participant C as 加密模块 A->>L: ValidateLicense() Note over A,L: 启动验证 L->>F: 读取许可证文件 F-->>L: 返回文件内容(JSON) L->>L: 解析JSON(Data, Signature) Note over L,C: 签名验证流程 L->>C: 对Data部分计算SHA256哈希 C-->>L: 返回哈希值 L->>C: 使用RSA公钥验证PSS签名 C-->>L: 返回验证结果(成功/失败) alt 签名验证失败 L-->>A: 返回错误:签名无效 else 签名验证成功 L->>L: Base64解码Data字段 L->>L: 解析JSON到LicenseInfo结构体 Note over L: 有效性检查 L->>L: 检查当前时间是否晚于ExpiryDate alt 许可证已过期 L-->>A: 返回错误:许可证已过期 else 许可证有效 L->>L: 更新lastCheckTime L-->>A: 返回*LicenseInfo结构体 end end # 使用方法 1. 执行脚本 openssl.sh 生成私钥和公钥 2. 执行licensegenerator/main.go方法,通过步骤1生成私钥生成license.lic 3. 将生成的license.lic和公钥证书放入您项目的特定位置。 4. 在您项目引入包如下: ``` go get gitee.com/yanwc/license ``` ## 项目中使用 ``` //os.Getenv("LICENSE_PATH") 步骤3的license.lic 文件路径 //os.Getenv("LICENSE_PUBLIC_KEY_PATH") 步骤1生成的公钥 //构造证书验证器 v, err := validator.NewLicenseValidator(os.Getenv("LICENSE_PATH"), os.Getenv("LICENSE_PUBLIC_KEY_PATH")) if err != nil { slog.Error("Failed new license validator", "error", err) os.Exit(1) } if _, err := v.ValidateLicense(); err != nil { slog.Error("Failed to validate lincese", "error", err) os.Exit(1) } //安装验证器,会每2分钟检查证书是否过期,生产环境建议24小时 v.Setup(2*time.Minute, false) //或者使用以下注释方法 // 只校验证书有效行 // err := t.SimpleValidate() // if err != nil { // return // } // 获取证书其他信息 // u, err := t.Validate() // if err != nil { // panic(err) // } ```