内容


探索 Eclipse 的插件签名机制

学习如何在 Eclipse 和 IBM Lotus Expeditor 中创建带签名插件

Comments

本文介绍了 Eclipse 插件签名及其应用。此外,还介绍了 IBM Lotus Expeditor 客户机供应系统(用于控制代码对本地或远程 Eclipse 更新站点的访问)所使用的测试策略。

签名是 Eclipse 安全功能不可或缺的机制。在插件下载期间,Eclipse 用户可以验证发布到更新站点上的 JAR 文件签名。这使用户能够获得将要安装的代码的可靠信息。该功能使用户能够识别代码的发布者,以及验证它在上传到更新站点之后是否被修改过。IBM Lotus Expeditor/Lotus Notes® 通过它的 Update Manager 组件使用这一安全机制,为用户提供一个签名检查。

先决条件

为了从本文获得最大的收益,您需要使用 Eclipse 开发环境和样例代码。如果您还没有 Eclipse,请下载:

Java 2 Standard Edition
可从 Sun Microsystems 获得 Java® 2 Standard Edition V5 或更新版本。
Eclipse
在 Eclipse Foundation 上可以找到 Eclipse 平台。如果要使用另一个测试平台,请下载 IBM Lotus Expeditor V6.1.x,但这是可选的。

查看 参考资料 小节获取 Eclipse 和 Java JDK。从 下载 小节获取样例代码。

背景

Eclipse 插件根据以下 5 种数字签名进行分类:

未签名插件
默认情况下,Eclipse 生成的所有插件都是未签名的。
签名插件
对未签名插件进行签名之后,它就变成签名插件。
可信插件
如果一个签名插件使用的是可信签名,Eclipse 运行时将信任该插件。因此,它就是一个可信插件。
不可信插件
这种签名插件使用的是不可信签名。
过期插件
所有签名插件都有一个有效期。插件封装在 JAR 文件中并且带有签名,但用于为 JAR 文件签名的证书已经过期,这种插件称为过期插件。
图 1. 插件的分类
插件分类
插件分类

实现和测试场景

学习如何使用 Eclipse、Keytool 和 Jarsigner 生成未签名的、不可信的和过期的插件,然后在 Eclipse 运行时和 IBM Lotus Expeditor 运行时中验证它们。让我们从一个未签名插件开始。

未签名特性

默认情况下,由 IDE(比如 Eclipse)生成的插件属于未签名插件。例如,我们通过以下步骤创建一个未签名插件:

  1. 单击 File > New > Project…> Plug-in Development > Plug-in project,然后单击 Next
  2. 在项目名字段中输入 HelloWorld,其他选择默认设置,然后单击 Next
  3. 在随后的 Plug-in Content 向导页面中单击 Next 按钮。
  4. 选择 HelloWorld 并在 Template 向导页面中单击 Finish 按钮。
  5. 单击 File > New > Project…> Plug-in Development > Feature project,接着单击 Next
  6. Project name 字段中输入 HelloWorld.feature,其他采用默认设置,然后单击 Next
  7. 选择刚才在 Referenced Plug-ins and Fragments 向导页面中创建的 HelloWorld 插件,然后单击 Finish
  8. 单击 File > New > Project…> Plug-in Development > Update Site project,接着单击 Next
  9. 在项目名字段中输入 HelloWorld.updatesite,其他采用默认设置,然后单击 Finish
  10. 单击 Add Feature… 按钮,选择 HelloWorld.feature,并单击 OK
  11. 单击 Build 在本地文件系统中生成更新站点文件。
  12. 验证刚才在工作空间中创建的更新站点。

通过以上的 12 个步骤,我们创建了一个 HelloWorld 样例插件、一个 HelloWorld 特性,以及一个用来封装它们的 HelloWorld 更新站点。

图 2. 插件的种类
插件的种类
插件的种类

我们使用 Eclipse Update Manager 通过以下步骤验证它的身份:

  1. 单击 Help > Software Update > Find and Install …
  2. 选择 Search for new feature to install 并单击 Next
  3. 单击 New Local Site … 按钮,导航到 HelloWorld 更新站点并单击 OK
  4. 单击 Finish

我们将收到一个 “unsigned feature” 通知,警告我们这个特性没有签名,并且无法验证其提供者。

图 3. 在 Eclipse 中验证未签名的插件
在 Eclipse 中验证未签名的插件
在 Eclipse 中验证未签名的插件

如果使用相同的步骤安装该插件,IBM Lotus Expeditor(一个基于 Eclipse 的强大平台)也会显示类似的警告消息。用户可以通过单击单选按钮选择接受或拒绝该插件,如下所示。

图 4. 在 IBM Lotus Expeditor 中验证未签名插件的测试场景
在 IBM Lotus Expeditor 中验证未签名插件的测试场景
在 IBM Lotus Expeditor 中验证未签名插件的测试场景

未签名特性

代码完整性的目标就是确定代码在安装之前未被修改。要实现这一目标,我们使用两个实用工具:Keytool 和 Jarsigner。

Keytool 是一个用来管理密匙和证书的命令行工具。证书是指来自某一实体(比如,个人、公司、计算机和程序等)的数字签名语句,它说明其他一些实体的公共密匙(或其他信息)有一个特定的值。Keytool 当前处理 X.509 证书。X.509 证书包括 Version、Validity Period、Subject Name(普通名称,组织部门,组织和国家)等。密匙和证书存储在 keystore 中,它实际上是一个文件。它通过密码保护私有密匙。

Jarsigner 是另一个用于为 JAR 文件签名并验证签名的实用工具。为了验证 JAR 文件中的数字签名,Jarsigner 将获取随 JAR 文件附带的证书,然后根据特定的 keystore 检查该证书的公共密匙是否可信。我们将在本文中使用 Jarsigner 的签名和验证功能。

首先,我们使用 Keytool 创建一个 keystore,它包含一对密匙(公共密匙和私有密匙)。发出以下命令。

清单 1. 创建一个 keystore
keytool -genkey -dname "cn=Li Xing Xing, ou=CDL, o=IBM, c=CN" -alias business -keypass 
 key123 -keystore C:\keystore\mykeystore -storepass store123 -validity 180

该命令完成以下任务:

  • 它在 C:\keystore 目录中创建一个名为 mykeystore 的 keystore 文件,并为它分配一个密码 store123。keystore 的默认类型是 jks。
  • 它为一个实体生成公共/私有密匙对。该实体的普通名称的 Distinguished Name 值是 “Li Xing Xing”,组织部门是 “CDL”,组织是 “IBM”,国家是 “CN”。密码 key123 分配给私有密匙。keystore 中将包含一个名为 “business” 的实体。
  • 它使用默认的 DSA 密匙生成算法,并创建两个 1024 位(默认长度)的密匙。
  • 它使用默认的签名算法(SHA1 和 DSA)创建一个带有自我签名的证书,有效期为 180 天。

相应地,将在目标文件夹中创建一个名为 mykeystore 的文件。

图 5. 生成的 Mykeystore
生成的 Mykeystore

创建一个带有自我签名的证书之后,我们将通过下面的 Jarsigner 命令使用它为 feature.jar 和 plugin.jar 签名,如清单 2 和清单 3 所示。在这里,我们以 jarsigner [options] jar-file alias 命令格式使用 Jarsigner 的签名功能。我们在选项字段中提供 keystore 文件的位置、keystore 密码和私有密匙密码。

清单 2. 为特性 JAR 文件签名
jarsigner -keystore C:\keystore\mykeystore -storepass store123 -keypass key123
  C:\workspace\HelloWorld.update\features\HelloWorld.feature_1.0.0.jar business
清单 3. 为插件 JAR 文件签名
jarsigner -keystore C:\keystore\mykeystore -storepass store123 -keypass key123
 C:\workspace\HelloWorld.update\plugins\HelloWorld.feature_1.0.0.jar business

因为有效期为 180 天,所以您将收到 6 个月后签名证书将过期的警告。如图 6 和图 7 中的最后一行所示。

图 6. 为特性 JAR 文件签名时收到的警告
为特性 JAR 文件签名时收到的警告
为特性 JAR 文件签名时收到的警告
图 7. 为插件 JAR 文件签名时收到的警告
为插件 JAR 文件签名时收到的警告
为插件 JAR 文件签名时收到的警告

通过运行以上两个命令,特性 JAR 文件和插件 JAR 文件会发生什么变化呢?在 HelloWorld.feature_1.0.0.jar 和 HelloWorld_1.0.0.jar 中打开 META-INF 文件夹,您将看到添加了两个文件 — 即 BUSINESS.SF 和 BUSINESS.DSA,如图 8 所示。

图 8. META-INF 文件夹中的 BUSINESS.DSA 和 BUSINESS.SF
META-INF 文件夹中的 BUSINESS.DSA 和 BUSINESS.SF

事实上,未签名和签名插件的区别就是多了这两个文件:.SF 和 .DSA。我们先探讨 BUSINESS.SF 文件。这是 JAR 文件的签名文件,它内部的信息根据 RFC822 标准以名称值对的形式显示。签名者由带有扩展名 .SF 的签名文件表示。主要部分的条目 x-Digest-Manifest-Main-Attributes(x 是摘要算法,比如 SHA1)包含清单文件的主要属性的摘要值。比如以 Base64 表示的嵌入式数据,这是一种使用 Internet 加密和传输 8 位字节的流行技术。表 1 列出了特性 JAR 文件和插件 JAR 文件中的 BUSINESS.SF 文件的示例内容,包括版本、签名算法、JVM 和摘要信息。

表 1. 特性 JAR 文件和插件 JAR 文件中的 BUSINESS.SF 文件
特性 JAR插件 JAR
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: wo/L6RyS5cmXUyjSULsCmbi//pc=
Created-By: 1.5.0 (IBM Corporation)
SHA1-Digest-Manifest: Hw4sDi+lK9Lk+yxEsiIBU4k8fdQ=

Name: feature.xml
SHA1-Digest: OOwzec1mVb8PGpLLjSy52QfDiR4=
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: Njf5Vhqe3paGaU+YpcW3RRd+nCg=
Created-By: 1.5.0 (IBM Corporation)
SHA1-Digest-Manifest: 2I/i8WO/wARcxqiOcs1ukjmquhA=

Name: helloworld/Activator.class
SHA1-Digest: fHk5c6yYAWPNvgZYLAENX/00axE=

BUSINESS.DSA 文件正好相反,它是一个更加复杂的二进制签名文件。这个签名块文件存储相应的签名文件的数字签名。如您所见,BUSINESS.DSA 文件和 BUSINESS.SF 文件使用相同的基文件名,但扩展名不同。实际上,还可以选择 .RSA 和 .PGP 作为二进制签名文件的扩展名,这取决于所使用的算法。图 9 显示了 BUSINESS.DSA 中包含的内容,以及使用文字处理器(我们使用 UltraEdit)转换后的一些可读信息。这意味着您可以看到一些文字字符串,比如 “CN”、“IBM”、“Lotus Expeditor” 和 “Li Xing Xing”。但是不能看到完整的信息。这就是签名的奇妙之处。

图 9. BUSINESS.DSA 内容
BUSINESS.DSA 内容
BUSINESS.DSA 内容

在安装插件 JAR 文件之前,我们可以使用 jarsigner -verify 命令验证它的签名。针对带签名的插件 JAR 文件发出以下命令,并获取响应。如图 10 所示。-verbose–certs 选项将在验证期间显示详细的输出和证书。

清单 4. 使用 Jarsigner 命令验证带签名的插件 JAR 文件
jarsigner -keystore C:\keystore\mykeystore –storepass store123 –verify –verbose
–certs C:\workspace\HelloWorld.update\plugins\HelloWorld_1.0.0.jar
图 10. 使用 Jarsigner 命令验证插件签名
使用 Jarsigner 命令验证插件签名
使用 Jarsigner 命令验证插件签名

当您使用 Jarsigner 的命令进行验证时,它将列出并验证 HelloWorld_1.0.0.jar 文件中的签名的基本信息和过期信息。

现在,尝试通过带签名的插件安装嵌入的更新站点。您将收到通知 “You are about to install a signed feature”,并且显示自我签名证书的详细信息。如图 11 所示。

图 11. 在 Eclipse 中验证带签名插件的测试场景
在 Eclipse 中验证带签名插件的测试场景
在 Eclipse 中验证带签名插件的测试场景

与未签名插件相比,用户更倾向于信任带签名的插件。当这样的签名插件安装到 IBM Lotus Expeditor 之后,将弹出一个类似的警告窗口,提醒用户有 3 种处理方式可供选择。

图 12. 在 IBM Lotus Expeditor 中验证带签名插件的测试场景
在 IBM Lotus Expeditor 中验证带签名插件的测试场景
在 IBM Lotus Expeditor 中验证带签名插件的测试场景

如果您单击 View Certificate Details…,将列出证书详细信息 — Version、Issued by、Issued to 和 Signature Algorithm,如图 13 所示。IBM Lotus Expeditor 提供更多的信息以鼓励用户信任该插件。

图 13. 签名插件中的签名证书的详细内容
签名插件中的签名证书的详细内容
签名插件中的签名证书的详细内容

带有过期签名的特性

根据图 11 中提供的信息,我们知道自我签名证书的有效期是 02-13-2009。如果将我们的操作系统时间更改为 02-14-2009(如图 14 所示),该签名插件将因为 “EXPIRED CERTIFICATE” 而过期。

图 14. 更改操作系统的系统时间
更改操作系统的系统时间
更改操作系统的系统时间

现在,我们可以使用一个 Jarsigner 命令验证签名,其结果是插件带有签名,但已经过期。请注意图 15 中的最后一个句子。

图 15. 通过 Jarsigner 命令验证插件的过期签名
通过 Jarsigner 命令验证插件的过期签名
通过 Jarsigner 命令验证插件的过期签名

如果使用更新管理器将这个插件安装到 Eclipse 运行时,Eclipse 将通知您插件带有签名,但已经过期,如图 16 所示。这是因为 Eclipse 检测到操作系统的当前日期(02-14-2009)已经超出有效期的范围(02-13-2009).因此,突出显示 “EXPIRED CERTIFICATE”,警告用户存在潜在风险。尽管插件的签名已经过期,用户仍然可以单击 InstallInstall All 按钮安装插件。这取决于用户。

图 16. 在 Eclipse 中验证过期插件的测试场景
在 Eclipse 中验证过期插件的测试场景
在 Eclipse 中验证过期插件的测试场景

图 17 展示了针对该插件的类似的过期证书通知。当将这样的插件安装到 IBM Lotus Expeditor 时,将弹出这个通知。

图 17. 在 IBM Lotus Expeditor 中验证过期插件的测试场景
在 IBM Lotus Expeditor 中验证过期插件的测试场景
在 IBM Lotus Expeditor 中验证过期插件的测试场景

结束语

Eclipse IDE 和 IBM Lotus Expeditor 有效地将签名安全机制应用到它们的供应子系统中,从而在将插件部署到终端用户桌面时增强它的安全性。本文探索插件签名机制的要点,包括插件的分类、创建和验证策略。本文介绍的样例插件(未签名的、签名的和过期的)适用于其他需要安全验证的基于 Eclipse 的产品。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source
ArticleID=361146
ArticleTitle=探索 Eclipse 的插件签名机制
publish-date=12242008