在為軟體安裝外掛程式時,安全性是一個很重要的問題。本文探索在 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 和 Java JDK。從 下載 小節擷取範例代碼。
背景
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.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 內容
在安裝外掛程式 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.linuxeden.com/html/sysadmin/20081225/63260.html