副標題:學習如何在 Eclipse 和 IBM Lotus Expeditor 中創建帶簽名插件
簡介:在為軟件安裝插件時,安全性是一個很重要的問題。本文探索在 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,請下載:
Java 2 Standard Edition 可從 Sun Microsystems 獲得 Java® 2 Standard Edition V5 或 更新版本。Eclipse 在 Eclipse Foundation 上可以找到 Eclipse 平台。如果要使用另一個測試平台, 請下載 IBM Lotus Expeditor V6.1.x,但這是可選的。
背景
Eclipse 插件根據以下 5 種數字 簽名進行分類:
未簽名插件 默認情況下,Eclipse 生成的所有插件都是未簽名的。簽名插件 對 未簽名插件進行簽名之後,它就變成簽名插件。可信插件 如果一個簽名插件使用的是可信簽名,Eclipse 運行時將信任該插件。因此,它就是一個可信插件。不可信插件 這種簽名插件使用的是不可信簽名。過 期插件 所有簽名插件都有一個有效期。插件封裝在 JAR 文件中並且帶有簽名,但用於為 JAR 文件簽名 的證書已經過期,這種插件稱為過期插件。圖 1. 插件的分類
實現和測試場景
學習如何使用 Eclipse、Keytool 和 Jarsigner 生成未簽名的、不可信的和過期的插件,然後在 Eclipse 運行時和 IBM Lotus Expeditor 運行時中驗證它們。讓我們從一個未簽名插件開始。
未 簽名特性
默認情況下,由 IDE(比如 Eclipse)生成的插件屬於未簽名插件。例如,我們通過以 下步驟創建一個未簽名插件:
單擊 File > New > Project…> Plug-in Development > Plug-in project,然後單擊 Next。
在項目名字段中輸入 HelloWorld,其他 選擇默認設置,然後單擊 Next。
在隨後的 Plug-in Content 向導頁面中單擊 Next 按鈕。
選擇 HelloWorld 並在 Template 向導頁面中單擊 Finish 按鈕。
單擊 File > New > Project…> Plug-in Development > Feature project,接著單擊 Next。
在 Project name 字段中輸入 HelloWorld.feature,其他采用默認設置,然後單擊 Next。
選擇剛 才在 Referenced Plug-ins and Fragments 向導頁面中創建的 HelloWorld 插件,然後單擊 Finish。
單擊 File > New > Project…> Plug-in Development > Update Site project,接著單擊 Next。
在項目名字段中輸入 HelloWorld.updatesite,其他采用默認設置, 然後單擊 Finish。
單擊 Add Feature… 按鈕,選擇 HelloWorld.feature,並單擊 OK。
單擊 Build 在本地文件系統中生成更新站點文件。
驗證剛才在工作空間中創建的更新站 點。
通過以上的 12 個步驟,我們創建了一個 HelloWorld 樣例插件、一個 HelloWorld 特性, 以及一個用來封裝它們的 HelloWorld 更新站點。
圖 2. 插件的種類
我們使用 Eclipse Update Manager 通過以下步驟驗證它的身份:
單擊 Help > Software Update > Find and Install …。
選擇 Search for new feature to install 並單擊 Next。
單擊 New Local Site … 按鈕,導航到 HelloWorld 更新站點並單擊 OK。
單擊 Finish。
我們將收到一個 “unsigned feature” 通知,警告我們這個特性沒有簽名,並且無 法驗證其提供者。
圖 3. 在 Eclipse 中驗證未簽名的插件
如果使用相同的步 驟安裝該插件,IBM Lotus Expeditor(一個基於 Eclipse 的強大平台)也會顯示類似的警告消息。用戶 可以通過單擊單選按鈕選擇接受或拒絕該插件,如下所示。
圖 4. 在 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
創建一個帶有自我簽名的證書之後,我們將通過下面的 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 文件簽名時收到的警告
圖 7. 為插件 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
事實上,未簽名和簽名插件的區別就是多了這兩個文件:.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.0BUSINESS.DSA 文件正好相反,它是一個更加復雜的二進制簽名文件。這個簽名塊文件存儲相應的簽名 文件的數字簽名。如您所見,BUSINESS.DSA 文件和 BUSINESS.SF 文件使用相同的基文件名,但擴展名不 同。實際上,還可以選擇 .RSA 和 .PGP 作為二進制簽名文件的擴展名,這取決於所使用的算法。圖 9 顯示了 BUSINESS.DSA 中包含的內容,以及使用文字處理器(我們使用 UltraEdit)轉換後的一些可讀信 息。這意味著您可以看到一些文字字符串,比如 “CN”、“IBM”、“Lotus Expeditor” 和 “Li Xing Xing”。但是不能看到完整的信息。這就是簽名的奇妙之處。
圖 9. 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 的命令進行驗證時,它將列出並驗證 HelloWorld_1.0.0.jar 文件中的簽名的基 本信息和過期信息。
現在,嘗試通過帶簽名的插件安裝嵌入的更新站點。您將收到通知 “You are about to install a signed feature”,並且顯示自我簽名證書的詳細信息。如圖 11 所示。
圖 11. 在 Eclipse 中驗證帶簽名插件的測試場景
與未簽名插件相比,用戶更傾向於信任帶簽名的插件。當這樣的簽名插件安裝到 IBM Lotus Expeditor 之後,將彈出一個類似的警告窗口,提醒用戶有 3 種處理方式可供選擇。
圖 12. 在 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 命令驗證插件的過期簽名
如果使用更新管理器將這個插件安裝到 Eclipse 運行時,Eclipse 將通知您插件帶有簽名,但已經過 期,如圖 16 所示。這是因為 Eclipse 檢測到操作系統的當前日期(02-14-2009)已經超出有效期的范 圍(02-13-2009).因此,突出顯示 “EXPIRED CERTIFICATE”,警告用戶存在潛在風險。盡管插件的簽 名已經過期,用戶仍然可以單擊 Install 或 Install All 按鈕安裝插件。這取決於用戶。
圖 16. 在 Eclipse 中驗證過期插件的測試場景
圖 17 展示了針對該插件的類似的過期證書通知。當將這樣的插件安裝到 IBM Lotus Expeditor 時, 將彈出這個通知。
圖 17. 在 IBM Lotus Expeditor 中驗證過期插件的測試場景
結束語
Eclipse IDE 和 IBM Lotus Expeditor 有效地將簽名安全機制應用到它們的供應子系統中,從而在將 插件部署到終端用戶桌面時增強它的安全性。本文探索插件簽名機制的要點,包括插件的分類、創建和驗 證策略。本文介紹的樣例插件(未簽名的、簽名的和過期的)適用於其他需要安全驗證的基於 Eclipse 的產品。
本文配套源碼:http://www.bianceng.net/java/201212/776.htm