在这个示例中主要是展示安全时间戳能力,安全时间戳(Time Stamp Authority,TSA)在一些对时间敏感的业务中非常有必要,比如交易业务和合同业务。TSA简单说是采用了数字证书技术的数字签名来产生数据,所以本实例中涉及了证书相关的内容。但很容易理解,后面也有专门的章节介绍数字证书。
(1)实现代码
代码首先定义了一个证书工厂类CertificateFactory变量cf,证书工厂类主要用来包装证书。首先调用了它的getInstance()静态方法获得一个实例,参数是X509。
第二行就是传统的Java IO类FileInputStream,用它来打开本地的一个证书文件。关于如何产生一个证书,后面会有专门的章节进行讲解,读者现在也可以在网上申请或下载一个,方便自己练习验证该段代码。
第三行调用工厂的generateCertificate()方法,参数是前面的文件实例,返回一个Certificate对象实例,目前读者先不用管它,后面涉及证书环节时会进一步用实例展示。
有了证书再次调用证书工厂类的generateCertPath()构建证书路径的方法,参数传递刚产生的证书实例数组(转成数组是因为证书可能是多个形成证书链)。
有了证书路径cp,就可以构建时间戳实例了,第一个参数给时间对象,第二个参数就是证书路径对象。
最后将这个时间戳打印输出。由于内容较长,为了节省篇幅,只显示开头部分。
(2)结果输出
读者可能会问,时间戳在工程项目里面怎么用呢?下面就给读者开阔下思路,补充一些代码签名的知识。
有了时间戳,可以对代码进行签名。这里就会引入了CodeSigner类,该类比较简单,方法较少。它的构造函数需要时间戳和证书路径。示意代码如下:
如果再深入讨论,CodeSigner类本身构建完成后就是一个不可修改类。它可以用在其他更高层次的判断中。这就引入了CodeSource类,该类扩展了代码基(codebase)的概念,不仅封装了位置(URL),还封装了用于验证源自该位置的签名代码的证书链。
Java的SDK中还为此专门提供了一个工具jarsigner,读者可以在命令行状态下用它来对代码进行签出或者验证。由于这些内容和密码技术关系不是很大,此处不再展开,有兴趣的读者可以按照前面的提示自己进行专项研究。