管理由私鑰和認證相關公鑰的 X.509 證書鏈組成的密鑰倉庫(數據庫)。還管理來自可信任實體的證書。
結構
keytool [ 命令 ]
說明
keytool 是個密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用于(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)或數據完整性以及認證服務。它還允許用戶儲存他們的通信對等者的公鑰(以證書形式)。
證書是來自一個實體(個人、公司等)的經數字簽名的聲明,它聲明某些其它實體的公鑰(及其它信息)具有某一的特定值(參見證書)。當數據被數字化簽名后,校驗簽名即可檢查數據的完整性和真實性。完整性的意思是數據沒有被修改或損壞過,真實性的意思是數據的確是來自聲稱創建了該數據和對它進行了簽名的實體。
keytool 將密鑰和證書儲存在一個所謂的密鑰倉庫中。缺省的密鑰倉庫實現將密鑰倉庫實現為一個文件。它用口令來保護私鑰。
jarsigner 工具利用密鑰倉庫中的信息來產生或校驗 Java 存檔 (JAR) 文件的數字簽名 (JAR 文件將類文件、圖象、聲音和/或其它數字化數據打包在一個文件中)。jarsigner 用 JAR 文件所附帶的證書(包含于 JAR 文件的簽名塊文件中)來校驗 JAR 文件的數字簽名,然后檢查該證書的公鑰是否“可信任”,即是否包括在指定的密鑰倉庫中。
請注意:keytool 和 jarsigner 工具完全取代了 JDK 1.1 中提供的 javakey 工具。這些新工具所提供的功能比 javakey 提供的多,包括能夠用口令來保護密鑰倉庫和私鑰,以及除了能夠生成簽名外還可以校驗它們。新的密鑰倉庫體系結構取代了 javakey 所創建和管理的身份數據庫。可以利用 -identitydb keytool 命令將信息從身份數據庫導入 密鑰倉庫。
密鑰倉庫項
在密鑰倉庫中有兩種不同類型的項:
密鑰項 - 每項存放極為敏感的加密密鑰信息,這種信息以一種受保護的格式儲存以防止未授權的訪問。通常,儲存在這類項中的密鑰是機密密鑰,或是伴有用于認證相應公鑰用的證書“鏈”的私鑰。keytool 和 jarsigner 工具只處理后一類型的項,即私鑰及其關聯的證書鏈。
可信任的證書項 - 每項包含一個屬于另一團體的公鑰證書。它之所以叫做“可信任的證書”,是因為密鑰倉庫的擁有者相信證書中的公鑰確實屬于證書“主體”(擁有者)識別的身份。證書簽發人通過對證書簽名來保證這點。
密鑰倉庫使用的別名
對所有的密鑰倉庫項(密鑰項和可信任的證書項)的訪問都要通過唯一的別名來進行。別名不區分大小寫,即別名 Hugo 和 hugo 指的是同一密鑰倉庫項。
當用 -genkey 命令來生成密鑰對(公鑰和私鑰)或用 -import 命令來將證書或證書鏈加到可信任證書的清單中,以增加一個實體到密鑰倉庫中,必須指定了一個別名。后續 keytool 命令必須使用這一相同的別名來引用該實體。
例如,假設您用別名 duke 生成了新的公鑰/私鑰密鑰對并將公鑰用以下命令打包到自簽名證書中(參見證書鏈):
keytool -genkey -alias duke -keypass dukekeypasswd
這指定了一個初始口令“dukekeypasswd”,接下來的命令都要使用該口令才能訪問與別名 duke 相關聯的私鑰。以后如果您想更改 duke 的 私鑰口令,可用類似下述的命令:
keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass
這將把口令從“dukekeypasswd”改為“newpass”。
請注意:實際上,除非是作為測試目的或是在安全的系統上,否則不應在命令行或腳本中指定口令。如果沒有在命令行上指定所要求的口令選項,您將會得到要求輸入口令的提示。當在口令提示符下鍵入口令時,口令將被即時顯示出來(鍵入什么就顯示什么),因此,要小心,不要當著任何人的面鍵入口令。
密鑰倉庫位置
每個 keytool 命令都有一個 -keystore 選項,用于指定 keytool 管理的密鑰倉庫的永久密鑰倉庫文件名稱及其位置。缺省情況下,密鑰倉庫儲存在用戶宿主目錄(由系統屬性的“user.home”決定)中名為 .keystore 的文件中。在 Solaris 系統中“user.home”缺省為用戶的宿主目錄。
密鑰倉庫的創建
當用 -genkey、-import 或 -identitydb 命令向某個尚不存在的密鑰倉庫添加數據時,就創建了一個密鑰倉庫。
具體地說,如果在 -keystore 選項中指定了一個并不存在的密鑰倉庫,則該密鑰倉庫將被創建。
如果不指定 -keystore 選項,則缺省密鑰倉庫將是宿主目錄中名為 .keystore 的文件。如果該文件并不存在,則它將被創建。
密鑰倉庫實現
java.security 包中提供的 KeyStore 類為訪問和修改密鑰倉庫中的信息提供了相當固定的接口。可以有多個不同的具體實現,其中每個實現都是對某個特定類型的密鑰倉庫的具體實現。
目前,有兩個命令行工具(keytool 和 jarsigner)以及一個名為 Policy Tool 的基于 GUI 的工具使用密鑰倉庫實現。由于密鑰倉庫是公用的,JDK 用戶可利用它來編寫其它的安全性應用程序。
Sun Microsystems 公司提供了一個內置的缺省實現。它利用名為“JKS” 的專用密鑰倉庫類型(格式),將密鑰倉庫實現為一個文件。它用個人口令保護每個私鑰,也用口令(可能為另一個口令)保護整個密鑰倉庫的完整性。
密鑰倉庫的實現基于提供者 (provider)。更具體地說,由密鑰倉庫所提供的應用程序接口是借助于“服務提供者接口”(SPI) 來實現的。也就是說,在 java.security 包中還有一個對應的抽象 KeystoreSpi 類,它定義了“提供者”必須實現的服務提供者接口方法。(術語“提供者”指的是一個或一組包,這個或這組包提供了一部份可由 Java 安全 API 訪問的服務子集的具體實現。因此,要提供某個密鑰倉庫實現,客戶機必須實現一個“提供者”并實現 KeystoreSpi 子類,如如何為 Java 加密體系結構實現 Provider 中所述。
通過使用 KeyStore 類中提供的“getInstance”工廠方法,應用程序可從不同的提供者中挑選不同類型的密鑰倉庫實現。密鑰倉庫類型定義密鑰倉庫信息的存儲和數據格式,以及用于保護密鑰倉庫中的私鑰和密鑰倉庫自身完整性的算法。不同類型的密鑰倉庫實現是不兼容的。
keytool 使用基于文件的密鑰倉庫實現 (它把在命令行中傳遞給它的密鑰倉庫位置當成文件名處理并將之轉換為文件輸入流,從該文件輸入流中加載密鑰倉庫信息)。另一方面,jarsigner 和 policytool 工具可從任何可用 URL 指定的位置讀取某個密鑰倉庫。
對于 keytool 和 jarsigner,可在命令行用 -storetype 選項指定密鑰倉庫類型。對于 Policy Tool,可通過 “編輯”菜單中的“更改密鑰倉庫”命令來指定密鑰倉庫類型。
如果沒有明確指定一個密鑰倉庫類型,這些工具將只是根據安全屬性文件中指定的 keystore.type 屬性值來選擇密鑰倉庫實現。安全屬性文件名為 java.security,它位于 JDK 安全屬性目錄 java.home/lib/security 中,其中 java.home 為 JDK 的安裝目錄。
每個工具都先獲取 keystore.type 的值,然后檢查所有當前已安裝的提供者直到找到一個實現所要求類型的密鑰倉庫的實現為止。然后就使用該提供者的密鑰倉庫實現。
KeyStore 類定義了一個名為 getDefaultType 的靜態方法,它可讓應用程序或 applet 檢索 keystore.type 屬性的值。以下代碼將創建缺省密鑰倉庫類型(此類型由 keystore.type 屬性所指定。)的一個實例:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
缺省的密鑰倉庫類型是“jks”(這是由“SUN”提供者提供的密鑰倉庫實現的專用類型)。它在安全性屬性文件中由下行進行指定:
keystore.type=jks
要讓工具使用不同于缺省類型的密鑰倉庫實現,可更改此行,指定不同的密鑰倉庫類型。
例如,如果您有一個這樣的提供者包,它給出一個名為“pkcs12”的密鑰倉庫類型的密鑰倉庫實現,則可將上面那行改為:
keystore.type=pkcs12
注意:密鑰倉庫類型的命名中大小寫無關緊要。例如,“JKS”將被認為是與“jks”相同的。
支持的算法和密鑰大小
keytool 允許用戶指定任何注冊了的加密服務提供者所提供的密鑰對生成和簽名算法。也就是說,各種命令中的 keyalg 和 sigalg 選項必須得到提供者的實現的支持。缺省的密鑰對生成算法是“DSA”。簽名算法是從所涉及私鑰的算法推導來的:如果所涉及的私鑰是“DSA”類型,則缺省的簽名算法為“SHA1withDSA”,如果所涉及的私鑰是“RSA”類型,則缺省的簽名算法為“MD5withRSA”。
在生成 DSA 密鑰對時,密鑰大小的范圍必須在 512 到 1024 位之間,且必須是 64 的倍數。缺省的密鑰大小為 1024 位。