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