这些Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变化以了解Java SE 9及后续版本中的更新语言功能的摘要。
请参阅JDK发行说明,了解有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
Java™平台使您能够对JAR文件进行数字签名。就像您可能用钢笔和墨水签署纸质文件一样,您对文件进行数字签名是为了让读者知道您编写了该文件,或者至少该文件得到了您的批准。
例如,当您签署一封信时,每个认识您签名的人都可以确认这封信是您写的。同样地,当您对文件进行数字签名时,任何“认识”您数字签名的人都知道该文件是来自您的。识别电子签名的过程被称为验证。
当JAR文件被签名时,您还可以选择为签名加上时间戳。类似于在纸质文件上写上日期,时间戳标识了JAR文件签名的时间。时间戳可用于验证在签名时使用的证书是否有效。
签名和验证文件的能力是Java平台安全体系结构的重要组成部分。安全性由运行时生效的安全策略控制。您可以配置策略以向小程序和应用程序授予安全权限。例如,您可以授予小程序执行通常被禁止的操作(如读写本地文件或运行本地可执行程序)的权限。如果您已下载了由可信实体签名的某些代码,则可以将此事实用作决定为代码分配哪些安全权限的标准。
一旦您(或您的浏览器)验证了小程序来自可信来源,您可以让平台放松安全限制,以允许小程序执行通常被禁止的操作。受信任的小程序可以根据生效的策略文件拥有特定的自由。
Java平台通过使用称为公钥和私钥的特殊数字来实现签名和验证。公钥和私钥成对出现,它们发挥着互补的作用。
私钥是您用来签署文件的电子“笔”。顾名思义,您的私钥仅为您所知,以便其他人无法“伪造”您的签名。使用您的私钥签署的文件只能通过相应的公钥进行验证。
然而,仅有公钥和私钥是不足以真正验证签名的。即使您已验证了签名文件包含匹配的密钥对,仍然需要一种方法来确认公钥实际上来自它所声称的签名者。
因此,为使签名和验证工作,还需要另一个元素。这个附加元素是签名者在签名的JAR文件中包含的证书。证书是一份由公认的认证机构数字签名的声明,指示谁拥有特定的公钥。认证机构是业界信任的实体(通常是专门从事数字安全的公司),它们签署并颁发用于密钥及其所有者的证书。在签名的JAR文件中,证书指示谁拥有该JAR文件中包含的公钥。
当您签名一个JAR文件时,您的公钥将与相关证书一起放置在存档中,以便任何想要验证您签名的人可以轻松使用。
总结数字签名:
当您签名一个JAR文件时,存档中的每个文件都会在存档的清单中获得一个摘要条目。以下是这样一个条目的示例:
名称:test/classes/ClassOne.class SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=
摘要值是文件内容的哈希或编码表示,表示签名时文件的内容。只有当文件本身发生更改时,文件的摘要才会改变。
当一个JAR文件被签名时,会自动生成一个签名文件,并将其放置在JAR文件的META-INF目录中,该目录与存档的清单位于同一目录。签名文件的文件名具有.SF扩展名。以下是签名文件的内容示例:
Signature-Version: 1.0 SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM= Created-By: 1.7.0_06 (Oracle Corporation) 名称:test/classes/ClassOne.class SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY= 名称:test/classes/ClassTwo.class SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM= 名称:test/images/ImageOne.gif SHA1-Digest: kdHbE7kL9ZHLgK7akHttYV4XIa0= 名称:test/images/ImageTwo.gif SHA1-Digest: mF0D5zpk68R4oaxEqoS9Q7nhm60=
如您所见,签名文件包含了存档文件的摘要条目,这些条目与清单中的摘要值条目相似。然而,清单中的摘要值是从文件本身计算得出的,而签名文件中的摘要值是从清单中相应条目计算得出的。签名文件还包含了整个清单的摘要值(请参见上述示例中的SHA1-Digest-Manifest头)。
在验证已签名的JAR文件时,会重新计算每个文件的摘要,并与清单中记录的摘要进行比较,以确保JAR文件的内容自签名以来未发生变化。作为附加检查,还会重新计算并比较清单文件本身的摘要值与签名文件中记录的值。
您可以在JDK™文档的清单格式页面上阅读有关签名文件的更多信息。
除了签名文件之外,当JAR文件被签名时,还会自动在META-INF目录中放置一个签名块文件。与清单文件或签名文件不同,签名块文件不可读。
签名块文件包含用于验证的两个关键元素:
签名块文件的文件名通常会有一个.DSA扩展名,表示它们是使用默认数字签名算法创建的。如果使用与其他标准算法相关的密钥进行签名,则可能会有其他文件名扩展名。
有关密钥、证书和认证机构的更多信息,请参阅:
有关Java平台安全架构的更多信息,请参阅以下相关文档: