在為軟體安裝插件時,安全性是一個很重要的問題。本文探索在 Eclipse 平台上使用的簽名技術,確定插件的可信度。Eclipse 將插件分為 5 類:簽名的、未簽名的、可信的、不可信的、過期的。通過本文學習如何在 Eclipse 和 IBM® Lotus® Expeditor(基於 Eclipse 的產品)中創建帶簽名的插件。
本文介紹了 Eclipse 插件簽名及其應用。此外,還介紹了 IBM Lotus Expeditor 客戶機供應系統(用於控制代碼對本地或遠程 Eclipse 更新站點的訪問)所使用的測試策略。
簽名是 Eclipse 安全功能不可或缺的機制。在插件下載期間,Eclipse 用戶可以驗證發布到更新站點上的 JAR 文件簽名。這使用戶能夠獲得將要安裝的代碼的可靠信息。該功能使用戶能夠識別代碼的發布者,以及驗證它在上傳到更新站點之後是否被修改過。IBM Lotus Expeditor/Lotus Notes® 通過它的 Update Manager 組件使用這一安全機制,為用戶提供一個簽名檢查。
先決條件
為了從本文獲得最大的收益,您需要使用 Eclipse 開發環境和樣例代碼。如果您還沒有 Eclipse,請下載:
查看 參考資料 小節獲取 Eclipse 和 Java JDK。從 下載 小節獲取樣例代碼。
背景
Eclipse 插件根據以下 5 種數字簽名進行分類:
實現和測試場景
學習如何使用 Eclipse、Keytool 和 Jarsigner 生成未簽名的、不可信的和過期的插件,然後在 Eclipse 運行時和 IBM Lotus Expeditor 運行時中驗證它們。讓我們從一個未簽名插件開始。
未簽名特性
默認情況下,由 IDE(比如 Eclipse)生成的插件屬於未簽名插件。例如,我們通過以下步驟創建一個未簽名插件:
通過以上的 12 個步驟,我們創建了一個 HelloWorld 樣例插件、一個 HelloWorld 特性,以及一個用來封裝它們的 HelloWorld 更新站點。
我們使用 Eclipse Update Manager 通過以下步驟驗證它的身份:
我們將收到一個 “unsigned feature” 通知,警告我們這個特性沒有簽名,並且無法驗證其提供者。
如果使用相同的步驟安裝該插件,IBM Lotus Expeditor(一個基於 Eclipse 的強大平台)也會顯示類似的警告消息。用戶可以通過單擊單選按鈕選擇接受或拒絕該插件,如下所示。
未簽名特性
代碼完整性的目標就是確定代碼在安裝之前未被修改。要實現這一目標,我們使用兩個實用工具:Keytool 和 Jarsigner。
Keytool 是一個用來管理密匙和證書的命令行工具。證書是指來自某一實體(比如,個人、公司、計算機和程序等)的數字簽名語句,它說明其他一些實體的公共密匙(或其他信息)有一個特定的值。Keytool 當前處理 X.509 證書。X.509 證書包括 Version、Validity Period、Subject Name(普通名稱,組織部門,組織和國家)等。密匙和證書存儲在 keystore 中,它實際上是一個文件。它通過密碼保護私有密匙。
Jarsigner 是另一個用於為 JAR 文件簽名並驗證簽名的實用工具。為了驗證 JAR 文件中的數字簽名,Jarsigner 將獲取隨 JAR 文件附帶的證書,然後根據特定的 keystore 檢查該證書的公共密匙是否可信。我們將在本文中使用 Jarsigner 的簽名和驗證功能。
首先,我們使用 Keytool 創建一個 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 |
該命令完成以下任務:
相應地,將在目標文件夾中創建一個名為 mykeystore 的文件。
創建一個帶有自我簽名的證書之後,我們將通過下面的 Jarsigner 命令使用它為 feature.jar 和 plugin.jar 簽名,如清單 2 和清單 3 所示。在這裡,我們以 jarsigner [options] jar-file alias 命令格式使用 Jarsigner 的簽名功能。我們在選項欄位中提供 keystore 文件的位置、keystore 密碼和私有密匙密碼。
jarsigner -keystore C:\keystore\mykeystore -storepass store123 -keypass key123 C:\workspace\HelloWorld.update\features\HelloWorld.feature_1.0.0.jar business |
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 中的最後一行所示。
通過運行以上兩個命令,特性 JAR 文件和插件 JAR 文件會發生什麼變化呢?在 HelloWorld.feature_1.0.0.jar 和 HelloWorld_1.0.0.jar 中打開 META-INF 文件夾,您將看到添加了兩個文件 — 即 BUSINESS.SF 和 BUSINESS.DSA,如圖 8 所示。
事實上,未簽名和簽名插件的區別就是多了這兩個文件:.SF 和 .DSA。我們先探討 BUSINESS.SF 文件。這是 JAR 文件的簽名文件,它內部的信息根據 RFC822 標準以名稱值對的形式顯示。簽名者由帶有擴展名 .SF 的簽名文件表示。主要部分的條目 x-Digest-Manifest-Main-Attributes(x 是摘要演算法,比如 SHA1)包含清單文件的主要屬性的摘要值。比如以 Base64 表示的嵌入式數據,這是一種使用 Internet 加密和傳輸 8 位位元組的流行技術。表 1 列出了特性 JAR 文件和插件 JAR 文件中的 BUSINESS.SF 文件的示例內容,包括版本、簽名演算法、JVM 和摘要信息。
特性 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”。但是不能看到完整的信息。這就是簽名的奇妙之處。
在安裝插件 JAR 文件之前,我們可以使用 jarsigner -verify 命令驗證它的簽名。針對帶簽名的插件 JAR 文件發出以下命令,並獲取響應。如圖 10 所示。-verbose 和 –certs 選項將在驗證期間顯示詳細的輸出和證書。
jarsigner -keystore C:\keystore\mykeystore –storepass store123 –verify –verbose –certs C:\workspace\HelloWorld.update\plugins\HelloWorld_1.0.0.jar |
當您使用 Jarsigner 的命令進行驗證時,它將列出並驗證 HelloWorld_1.0.0.jar 文件中的簽名的基本信息和過期信息。
現在,嘗試通過帶簽名的插件安裝嵌入的更新站點。您將收到通知 “You are about to install a signed feature”,並且顯示自我簽名證書的詳細信息。如圖 11 所示。
與未簽名插件相比,用戶更傾向於信任帶簽名的插件。當這樣的簽名插件安裝到 IBM Lotus Expeditor 之後,將彈出一個類似的警告窗口,提醒用戶有 3 種處理方式可供選擇。
如果您單擊 View Certificate Details…,將列出證書詳細信息 — Version、Issued by、Issued to 和 Signature Algorithm,如圖 13 所示。IBM Lotus Expeditor 提供更多的信息以鼓勵用戶信任該插件。
帶有過期簽名的特性
根據圖 11 中提供的信息,我們知道自我簽名證書的有效期是 02-13-2009。如果將我們的操作系統時間更改為 02-14-2009(如圖 14 所示),該簽名插件將因為 “EXPIRED CERTIFICATE” 而過期。
現在,我們可以使用一個 Jarsigner 命令驗證簽名,其結果是插件帶有簽名,但已經過期。請注意圖 15 中的最後一個句子。
如果使用更新管理器將這個插件安裝到 Eclipse 運行時,Eclipse 將通知您插件帶有簽名,但已經過期,如圖 16 所示。這是因為 Eclipse 檢測到操作系統的當前日期(02-14-2009)已經超出有效期的範圍(02-13-2009).因此,突出顯示 “EXPIRED CERTIFICATE”,警告用戶存在潛在風險。儘管插件的簽名已經過期,用戶仍然可以單擊 Install 或 Install All 按鈕安裝插件。這取決於用戶。
圖 17 展示了針對該插件的類似的過期證書通知。當將這樣的插件安裝到 IBM Lotus Expeditor 時,將彈出這個通知。
結束語
Eclipse IDE 和 IBM Lotus Expeditor 有效地將簽名安全機制應用到它們的供應子系統中,從而在將插件部署到終端用戶桌面時增強它的安全性。本文探索插件簽名機制的要點,包括插件的分類、創建和驗證策略。本文介紹的樣例插件(未簽名的、簽名的和過期的)適用於其他需要安全驗證的基於 Eclipse 的產品。(責任編輯:A6)
[火星人 ] 探索 Eclipse 的插件簽名機制已經有662次圍觀