truelicense简要说明
博客专区 > Airship 的博客 > 博客详情
truelicense简要说明
Airship 发表于8个月前
truelicense简要说明
  • 发表于 8个月前
  • 阅读 18
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

truelicense简要说明

2012-08-01 21:38 by 尔, 558 阅读, 0 评论, 收藏编辑

使用trueLicense来做软件产品的保护,我们主要使用它的LicenseManager类来生成证书文件、安装证书文件、验证证书文件.

 

假设我们已为我们软件的使用者提供了证书,下面的流程图为简略的trueLicense验证证书文件的流程。

 

 

LicenseEngine是我们自己写的一个引擎类,它封装了一些业务逻辑,以方便外部进行调用,我们验证license文件时,首先要安装license文件,安装license文件就是把文件形式的license文件(数字签名过的普通文本文件)转换成GenericCertificate对象,这个以及其他的持久化操作是由de.schlichtherle.xml.PersistenceService类提供的。

GenericCertificate是一个起纽带作用的类,也是truelicense最底层最核心的类。它对最底层的javax.crypto包下类的方法进行了逻辑封装,truelicense上层在生成license文件时对其数字签名以及在验证证书内容时解密证书内容就是借助它来完成的。

 

安装license文件和调用verify()方法时都会进行certification的验证和license内容的校验。

从LicenseManager的install()方法的源码中可以看出我们最好让LicenseManager为单例,只要虚拟机一直运行,在安装license时,install方法会通过setCertificate(certificate)来设置系统当前的certificate,注意LicenseManager是线程安全的类,使用得当的情况下单例也不会出现线程问题。

以下是install方法的源码。

validate(LicenseContent content)方法会验证证书的基本内容,最主要的是验证内容是对比当前日期和证书上的有效期。trueLicense的验证机制是当验证失败后,直接抛出异常。

下面简要说明如何生成license文件

首先license文件是被数字签名的普通文本信息,我们需要一个私钥库来生成私钥来用于加密,我们相应也需要一个从私钥库中导出的公钥来解密,我们可以使用JAVA的Toolkit来生成私钥库。

(1)命令行下:

keytool -genkey -alias privatekey -keystore privateKeys.store   

 

此时生成私钥库。

别名很重要 请务必记下来。

此时会提示你输入keyStore的密码,注意此时有个小陷阱,请务必把密码设置为数字和小写字母的混合体,原因是因为TrueLicense安全机制需要至少6个字符且同时包含数字和字母,否则汇报错。

 

 

(2)然后把私匙库内的公匙导出到一个文件当中:
keytool -export -alias privatekey -file certfile.cer -keystore privateKeys.store

 

 

(3)然后再把这个证书文件导入到公匙库:

keytool -import -alias publiccert -file certfile.cer -keystore publicCerts.store


这个公钥库要随软件一起发布给用户。

 

 

 

 

 

 

生成license文件依然需要用到LicenseManager类

从它实现的接口上看知道其既有创建License的职责又有验证License文件的职责。

调用LicenseManager的实例方法store(LicenseContent, File)即可生成license文件。

 下面是LiicenseManager类构造器的源码。

 public LicenseManager(LicenseParam param) {

        setLicenseParam0(param);

 }

生成一个LicenseManager类的实例,需要一个LicenseParam类型的形参。

下面是LicenseParam的继承体系

 

它持有生成license和验证license时所需要的一些对象。

注意这里的subject和LicensContent的subject必须一致,否则不能通过验证而抛出异常。

 

KeyStoreParam是根据公、私匙库的参数抽象出的类,在底层操作公私钥库时需要这些具体的参数(如通过alias来找到具体的钥库等

 

 

 

 

下面是简要的license文件生成的时序图。

 

 

 

简单说来就是对licenseContent的byte[]形式先进行签名,然后将byte[]以文件的形式输出。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 31
博文 747
码字总数 18671
×
Airship
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: