这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
该课程展示了如何使用keytool、jarsigner、policy tool和jar工具将文件放入jar (Java ARchive)文件中,以便jarsigner工具后续完成签名。
该课程分为两部分:首先,您将创建和部署一个应用程序;其次您将作为已签署应用程序的收件人。
注意:为了方便起见,您可以假装是一个名为Susan Jones的用户或开发人员。您需要在生成密钥时定义Susan Jones。
注意:为了方便起见,您可以假装是一个名为Ray的用户。
有关数字签名、证书、密钥库和工具的更多信息,请参见用于代码安全和文件交换的API和工具。
$ java Count data
Counted 2304 chars.
$ jar cvf Count.jar Count.class
已添加清单
正在添加: Count.class(输入 = 1216) (输出 = 690)(压缩了 43%)
$ keytool -genkeypair -alias signFiles -keystore examplestore -storetype pkcs12
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: Susan Jones
您的组织单位名称是什么?
[Unknown]: Purchasing
您的组织名称是什么?
[Unknown]: ExampleCompany
您所在的城市或区域名称是什么?
[Unknown]: Cupertino
您所在的省/市/自治区名称是什么?
[Unknown]: CA
该单位的双字母国家/地区代码是什么?
[Unknown]: US
CN=Susan Jones, OU=Purchasing, O=ExampleCompany, L=Cupertino, ST=CA, C=US是否正确?
[否]: y
$ jarsigner -keystore /Users/qinzy/keystore/examplestore -signedjar sCount.jar Count.jar signFiles
输入密钥库的密码短语:
jar 已签名。
警告:
签名者证书将在六个月内过期。
未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期日期 (2019-10-20) 或以后的任何撤销日期之后, 用户可能无法验证此jar。
请参考jar签名为jar文件签一个带时间戳的签名。
$ keytool -export -keystore examplestore -alias signFiles -file Example.cer
输入密钥库口令:
存储在文件 <Example.cer> 中的证书
在该课程中,您扮演已签名jar文件的接收方。该jar文件将向未被授权的系统资源请求访问。
这个过程需要您完成以下步骤:
$ java -Djava.security.manager -cp sCount.jar Count
/Users/qinzy/workspace/github/jdk-sample/out/production/jdk-sample
Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "/Users/qinzy/workspace/github/jdk-sample/out/production/jdk-sample" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
at java.io.FileInputStream.<init>(FileInputStream.java:127)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at Count.main(Count.java:19)
$ keytool -import -alias susan -file Example.cer -keystore exampleraystore
输入密钥库口令:
再次输入新口令:
所有者: CN=Susan Jones, OU=Purchasing, O=ExampleCompany, L=Cupertino, ST=CA, C=US
发布者: CN=Susan Jones, OU=Purchasing, O=ExampleCompany, L=Cupertino, ST=CA, C=US
序列号: 5bc1c1c
有效期为 Mon Jul 22 14:28:38 CST 2019 至 Sun Oct 20 14:28:38 CST 2019
证书指纹:
MD5: E9:1B:9F:08:49:15:43:93:7D:86:0D:8A:14:7A:65:14
SHA1: 17:E9:91:20:9D:D6:F2:9B:EE:A3:50:E0:D7:79:78:E8:CE:A1:7C:22
SHA256: 32:D1:8F:3B:74:99:F4:7E:43:1E:36:86:78:FA:54:78:32:63:1D:01:5B:05:2D:48:30:7C:7B:66:6D:36:E4:F6
签名算法名称: SHA256withDSA
主体公共密钥算法: 2048 位 DSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 31 E4 96 17 CE EF CD 5D CF 37 00 27 BC 74 97 91 1......].7.'.t..
0010: 00 DA EF 0F ....
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
参考用于代码安全和文件交换的API和工具 生成策略文件exampleraypolicy:针对通过别名为susan的证书签名的代码增加对data文件所在的目录下所有的文件都有read权限,然后运行:
$ java -Djava.security.manager -Djava.security.policy=/Users/qinzy/keystore/exampleraypolicy -cp sCount.jar Count /Users/qinzy/workspace/github/jdk-sample/out/production/jdk-sample/data
Counted 2304 chars.