代码签名并授权

这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。

课程:代码签名并授权

该课程展示了如何使用keytool、jarsigner、policy tool和jar工具将文件放入jar (Java ARchive)文件中,以便jarsigner工具后续完成签名。

该课程分为两部分:首先,您将创建和部署一个应用程序;其次您将作为已签署应用程序的收件人。

创建和部署应用的步骤如下:

注意:为了方便起见,您可以假装是一个名为Susan Jones的用户或开发人员。您需要在生成密钥时定义Susan Jones。

  • 将包含应用程序的Java类文件放入JAR文件中
  • 在JAR文件上签名
  • 导出与用于签名JAR文件的私钥对应的公钥证书
为应用授权的步骤如下:

注意:为了方便起见,您可以假装是一个名为Ray的用户。

  • 您可以看到一开始已签名的应用在安全管理器中运行不能读取指定的文件
  • 使用 keytool 命令将证书导入到Ray的密钥库中,别名取为susan
  • 使用policy tool 在Ray的策略文件中创建一个条目,以允许用 susan 签名的代码读取指定的文件。
  • 最后,您将看到在安全管理器下运行的应用程序可以读取文件,因为它已经获得了读取文件的权限。

有关数字签名、证书、密钥库和工具的更多信息,请参见用于代码安全和文件交换的API和工具。

为代码签名的步骤如下:
  1. 创建一个名为Count.java的文件,这个程序将会访问一个data文件,编译后运行
$ java Count data
Counted 2304 chars.
  1. 使用 jar 工具 将class文件打包到jar文件中
$ jar cvf Count.jar Count.class
已添加清单
正在添加: Count.class(输入 = 1216) (输出 = 690)(压缩了 43%)
  1. 使用 keytool 工具生成密钥对
$ 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
  1. 使用jarsigner和私钥对jar文件签名
$ jarsigner -keystore /Users/qinzy/keystore/examplestore -signedjar sCount.jar Count.jar signFiles
输入密钥库的密码短语: 
jar 已签名。

警告: 
签名者证书将在六个月内过期。
未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期日期 (2019-10-20) 或以后的任何撤销日期之后, 用户可能无法验证此jar。

请参考jar签名为jar文件签一个带时间戳的签名。

  1. 使用keytool -export导出公钥证书,并把签名后的jar和证书提供给接收者Ray
$ 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.

你可能感兴趣的:(程序语言,Java,JDK1.8官方文档翻译,java,security)