對(duì)所有的密鑰倉庫項(xiàng)(密鑰項(xiàng)和可信任的證書項(xiàng))的訪問都要通過唯一的別名來進(jìn)行。別名不區(qū)分大小寫,即別名 Hugo 和 hugo 指的是同一密鑰倉庫項(xiàng)。
當(dāng)用 -genkey 命令來生成密鑰對(duì)(公鑰和私鑰)或用 -import 命令來將證書或證書鏈加到可信任證書的清單中,以增加一個(gè)實(shí)體到密鑰倉庫中,必須指定了一個(gè)別名。后續(xù) keytool 命令必須使用這一相同的別名來引用該實(shí)體。
例如,假設(shè)您用別名 duke 生成了新的公鑰/私鑰密鑰對(duì)并將公鑰用以下命令打包到自簽名證書中(參見證書鏈):
??? keytool -genkey -alias duke -keypass dukekeypasswd
這指定了一個(gè)初始口令“dukekeypasswd”,接下來的命令都要使用該口令才能訪問與別名 duke 相關(guān)聯(lián)的私鑰。以后如果您想更改 duke 的 私鑰口令,可用類似下述的命令: ??? keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass
這將把口令從“dukekeypasswd”改為“newpass”。
請(qǐng)注意:實(shí)際上,除非是作為測試目的或是在安全的系統(tǒng)上,否則不應(yīng)在命令行或腳本中指定口令。如果沒有在命令行上指定所要求的口令選項(xiàng),您將會(huì)得到要求輸入口令的提示。當(dāng)在口令提示符下鍵入口令時(shí),口令將被即時(shí)顯示出來(鍵入什么就顯示什么),因此,要小心,不要當(dāng)著任何人的面鍵入口令。
java.security 包中提供的 KeyStore 類為訪問和修改密鑰倉庫中的信息提供了相當(dāng)固定的接口。可以有多個(gè)不同的具體實(shí)現(xiàn),其中每個(gè)實(shí)現(xiàn)都是對(duì)某個(gè)特定類型的密鑰倉庫的具體實(shí)現(xiàn)。
目前,有兩個(gè)命令行工具(keytool 和 jarsigner)以及一個(gè)名為 Policy Tool 的基于 GUI 的工具使用密鑰倉庫實(shí)現(xiàn)。由于密鑰倉庫是公用的,JDK 用戶可利用它來編寫其它的安全性應(yīng)用程序。
Sun Microsystems 公司提供了一個(gè)內(nèi)置的缺省實(shí)現(xiàn)。它利用名為“JKS” 的專用密鑰倉庫類型(格式),將密鑰倉庫實(shí)現(xiàn)為一個(gè)文件。它用個(gè)人口令保護(hù)每個(gè)私鑰,也用口令(可能為另一個(gè)口令)保護(hù)整個(gè)密鑰倉庫的完整性。
密鑰倉庫的實(shí)現(xiàn)基于提供者 (provider)。更具體地說,由密鑰倉庫所提供的應(yīng)用程序接口是借助于“服務(wù)提供者接口”(SPI) 來實(shí)現(xiàn)的。也就是說,在 java.security 包中還有一個(gè)對(duì)應(yīng)的抽象 KeystoreSpi 類,它定義了“提供者”必須實(shí)現(xiàn)的服務(wù)提供者接口方法。(術(shù)語“提供者”指的是一個(gè)或一組包,這個(gè)或這組包提供了一部份可由 Java 安全 API 訪問的服務(wù)子集的具體實(shí)現(xiàn)。因此,要提供某個(gè)密鑰倉庫實(shí)現(xiàn),客戶機(jī)必須實(shí)現(xiàn)一個(gè)“提供者”并實(shí)現(xiàn) KeystoreSpi 子類,如如何為 Java 加密體系結(jié)構(gòu)實(shí)現(xiàn) Provider 中所述。
通過使用 KeyStore 類中提供的“getInstance”工廠方法,應(yīng)用程序可從不同的提供者中挑選不同類型的密鑰倉庫實(shí)現(xiàn)。密鑰倉庫類型定義密鑰倉庫信息的存儲(chǔ)和數(shù)據(jù)格式,以及用于保護(hù)密鑰倉庫中的私鑰和密鑰倉庫自身完整性的算法。不同類型的密鑰倉庫實(shí)現(xiàn)是不兼容的。
keytool 使用基于文件的密鑰倉庫實(shí)現(xiàn) (它把在命令行中傳遞給它的密鑰倉庫位置當(dāng)成文件名處理并將之轉(zhuǎn)換為文件輸入流,從該文件輸入流中加載密鑰倉庫信息)。另一方面,jarsigner 和 policytool 工具可從任何可用 URL 指定的位置讀取某個(gè)密鑰倉庫。
對(duì)于 keytool 和 jarsigner,可在命令行用 -storetype 選項(xiàng)指定密鑰倉庫類型。對(duì)于 Policy Tool,可通過 “編輯”菜單中的“更改密鑰倉庫”命令來指定密鑰倉庫類型。
如果沒有明確指定一個(gè)密鑰倉庫類型,這些工具將只是根據(jù)安全屬性文件中指定的 keystore.type 屬性值來選擇密鑰倉庫實(shí)現(xiàn)。安全屬性文件名為 java.security,它位于 JDK 安全屬性目錄 java.home/lib/security 中,其中 java.home 為 JDK 的安裝目錄。
每個(gè)工具都先獲取 keystore.type 的值,然后檢查所有當(dāng)前已安裝的提供者直到找到一個(gè)實(shí)現(xiàn)所要求類型的密鑰倉庫的實(shí)現(xiàn)為止。然后就使用該提供者的密鑰倉庫實(shí)現(xiàn)。
KeyStore 類定義了一個(gè)名為 getDefaultType 的靜態(tài)方法,它可讓應(yīng)用程序或 applet 檢索 keystore.type 屬性的值。以下代碼將創(chuàng)建缺省密鑰倉庫類型(此類型由 keystore.type 屬性所指定。)的一個(gè)實(shí)例:
??? KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
缺省的密鑰倉庫類型是“jks”(這是由“SUN”提供者提供的密鑰倉庫實(shí)現(xiàn)的專用類型)。它在安全性屬性文件中由下行進(jìn)行指定: ??? keystore.type=jks
要讓工具使用不同于缺省類型的密鑰倉庫實(shí)現(xiàn),可更改此行,指定不同的密鑰倉庫類型。
例如,如果您有一個(gè)這樣的提供者包,它給出一個(gè)名為“pkcs12”的密鑰倉庫類型的密鑰倉庫實(shí)現(xiàn),則可將上面那行改為:
??? keystore.type=pkcs12
注意:密鑰倉庫類型的命名中大小寫無關(guān)緊要。例如,“JKS”將被認(rèn)為是與“jks”相同的。
證書(也叫公鑰證書)是來自某個(gè)實(shí)體(簽發(fā)人)的經(jīng)數(shù)字簽名的聲明,它聲明另一實(shí)體(主體)的公鑰(及其它信息)具有某一特定的值。
下面詳細(xì)解釋本句中使用的主要術(shù)語:
?
- 公鑰
- 是與特定實(shí)體相關(guān)聯(lián)的數(shù)字。所有需要與該實(shí)體進(jìn)行信任交互的人都應(yīng)知道該數(shù)字。公鑰用于校驗(yàn)簽名。
- 經(jīng)數(shù)字簽名
- 如果某些數(shù)據(jù)經(jīng)數(shù)字簽名,說明它們已與某一實(shí)體的“身份”存儲(chǔ)在一起,而且證明該實(shí)體的簽名知道這些數(shù)據(jù)。通過用該實(shí)體的私鑰進(jìn)行繪制,這些數(shù)據(jù)就是不可偽造的了。
- 身份
- 用于聲明實(shí)體的一種手段。某些系統(tǒng)中,身份是公鑰,而在另一些系統(tǒng)中則可以是 Unix UID、電子郵件地址或 X.509 特征名等等。
- 簽名
- 所謂簽名,就是用實(shí)體的(簽名人,在證書中也稱為簽發(fā)人)私鑰對(duì)某些數(shù)據(jù)進(jìn)行計(jì)算。
- 私鑰
- 是一些數(shù)字,每個(gè)數(shù)字都應(yīng)僅被以該數(shù)字作為私鑰的特定實(shí)體所知(即該數(shù)字應(yīng)保密)。在所有公鑰密碼系統(tǒng)中,私鑰和公鑰均成對(duì)出現(xiàn)。在 DSA 等具體的公鑰密碼系統(tǒng)中,一個(gè)私鑰只對(duì)應(yīng)一個(gè)公鑰。私鑰用于計(jì)算簽名。
- 實(shí)體
- 實(shí)體是您在某種程度上對(duì)其加以信任的個(gè)人、組織、程序、計(jì)算機(jī)、企業(yè)、銀行等。
通常,公鑰密碼系統(tǒng)需要訪問用戶的公鑰。在大型聯(lián)網(wǎng)環(huán)境中,并不能確保通信實(shí)體之間已經(jīng)預(yù)先建立起關(guān)系,也無法確保受信任的儲(chǔ)存庫與所用的公鑰都存在。于是人們發(fā)明了證書作為公鑰分配問題的解決辦法。現(xiàn)在,認(rèn)證機(jī)構(gòu) (CA) 可充當(dāng)可信任的第三方。CA 是可信任的向其它實(shí)體簽名(發(fā)放)證書的實(shí)體(例如企業(yè))。由于 CA 受法律協(xié)議約束,因此可認(rèn)為它們只提供可靠有效的證書。公共認(rèn)證機(jī)構(gòu)數(shù)量很多,例如 VeriSign、Thawte、Entrust 等等。您還可以使用諸如 Netscape/Microsoft Certificate Servers 或 Entrust CA 等產(chǎn)品來自己運(yùn)營認(rèn)證機(jī)構(gòu)。
使用 keytool 可以顯示、導(dǎo)入和導(dǎo)出證書。還可以產(chǎn)生自簽名證書。
keytool 目前處理 X.509 證書。
X.509 證書
X.509 標(biāo)準(zhǔn)規(guī)定了證書可以包含什么信息,并說明了記錄信息的方法(數(shù)據(jù)格式)。除了簽名外,所有 X.509 證書還包含以下數(shù)據(jù):
?
- 版本
- 識(shí)別用于該證書的 X.509 標(biāo)準(zhǔn)的版本,該版本影響證書中所能指定的信息。迄今為止,已定義的版本有三個(gè)。keytool 可導(dǎo)入和導(dǎo)出 v1、v2 和 v3 版的證書。它只能生成 v1 版證書。
- 序列號(hào)
- 發(fā)放證書的實(shí)體有責(zé)任為證書指定序列號(hào),以使其區(qū)別于該實(shí)體發(fā)放的其它證書。此信息用途很多。例如,如果某一證書被撤消,其序列號(hào)將放到證書撤消清單 (CRL) 中。
- 簽名算法標(biāo)識(shí)符
- 用于標(biāo)識(shí) CA 簽名證書時(shí)所用的算法。
- 簽發(fā)人名稱
- 簽名證書的實(shí)體的 X.500 特征名。它通常為一個(gè) CA。使用該證書意味著信任簽名該證書的實(shí)體。注意:有些情況下(例如根或頂層 CA 證書),簽發(fā)人會(huì)簽名自己的證書。
- 有效期
- 每個(gè)證書均只能在一個(gè)有限的時(shí)間段內(nèi)有效。該有效期以起始日期和時(shí)間及終止日期和時(shí)間表示,可以短至幾秒或長至一世紀(jì)。所選有效期取決于許多因素,例如用于簽名證書的私鑰的使用頻率及愿為證書支付的金錢等。它是在沒有危及相關(guān)私鑰的條件下,實(shí)體可以依賴公鑰值的預(yù)計(jì)時(shí)間。
- 主體名
- 證書可以識(shí)別其公鑰的實(shí)體名。此名稱使用 X.500 標(biāo)準(zhǔn),因此在Internet中應(yīng)是唯一的。它是實(shí)體的 X.500 特征名 (DN),例如,
??? CN=Java Duke, OU=Java Software Division, O=Sun Microsystems Inc, C=US
(這些指主體的通用名、組織單位、組織和國家。)
- 主體公鑰信息
- 這是被命名實(shí)體的公鑰,同時(shí)包括指定該密鑰所屬公鑰密碼系統(tǒng)的算法標(biāo)識(shí)符及所有相關(guān)的密鑰參數(shù)。
X.509 1 版 1988 年發(fā)布,已得到廣泛使用,是最常用的版本。
X.509 2 版引入了主體和簽發(fā)人唯一標(biāo)識(shí)符的概念,以解決主體和/或簽發(fā)人名稱在一段時(shí)間后可能重復(fù)使用的問題。大多數(shù)證書監(jiān)視文檔都極力建議不要重復(fù)使用主體或簽發(fā)人名稱,而且建議證書不要使用唯一標(biāo)識(shí)符。版本 2 證書尚未得到廣泛使用。
X.509 3 版是最新的版本(1996 年)。它支持?jǐn)U展的概念,因此任何人均可定義擴(kuò)展并將其納入證書中。現(xiàn)在常用的擴(kuò)展包括:KeyUsage(僅限密鑰用于特殊目的,例如“只簽名”)和 AlternativeNames(允許其它身份也與該公鑰關(guān)聯(lián),例如 DNS 名、電子郵件地址、IP 地址)。擴(kuò)展可標(biāo)記為“極重要”,以表示該擴(kuò)展應(yīng)被檢查并執(zhí)行或使用。例如,如果某一證書將 KeyUsage 擴(kuò)展標(biāo)記為“極重要”,而且設(shè)置為“keyCertSign”,則在 SSL 通訊期間該證書出現(xiàn)時(shí)將被拒絕,因?yàn)樵撟C書擴(kuò)展表示相關(guān)私鑰應(yīng)只用于簽名證書,而不應(yīng)該用于 SSL。
證書中的所有數(shù)據(jù)均用兩個(gè)名為 ASN.1/DER 的相關(guān)標(biāo)準(zhǔn)進(jìn)行編碼。抽象語法注釋 1(Abstract Syntax Notation 1) 描述數(shù)據(jù)。確定性編碼規(guī)則 (Definite Encoding Rules) 描述儲(chǔ)存和傳輸該數(shù)據(jù)的唯一方式。
X.500 特征名
X.500 特征名用于標(biāo)識(shí)實(shí)體,例如 X.509 證書的 主體和簽發(fā)人(簽名人)域所命名的實(shí)體。keytool 支持以下的子組件:
?
- commonName - 個(gè)人常用名,例如“Susan Jones”
- organizationUnit - 小型組織(例如部門或分部)的名稱,例如“Purchasing”
- organizationName - 大型組織的名稱,例如“ABCSystems, Inc.”
- localityName - 地方(城市)名,例如“Palo Alto”
- stateName - 州或省份名,例如“California”
- country - 兩個(gè)字母的國家代碼,例如“CH”
當(dāng)給出一個(gè)特征名字符串作為 -dname 選項(xiàng)的值時(shí),例如 -genkey 或 -selfcert 命令中的該選項(xiàng),字符串必須為以下格式: CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode
其中所有的斜體字代表實(shí)際值而上面的關(guān)鍵字是以下縮寫: ??????? CN=commonName
??????? OU=organizationUnit
??????? O=organizationName
??????? L=localityName
??????? S=stateName
??????? C=country
以下是特征名字符串樣本: CN=Mark Smith, OU=JavaSoft, O=Sun, L=Cupertino, S=California, C=US
以下是使用這一字符串的樣本命令: keytool -genkey -dname "CN=Mark Smith, OU=JavaSoft, O=Sun, L=Cupertino,
S=California, C=US" -alias mark
大小寫對(duì)關(guān)鍵字縮寫無關(guān)緊要。例如,“CN”、“cn”和“Cn”都將被當(dāng)作是一樣的。
但順序是有關(guān)系的;每個(gè)子組件必須按設(shè)計(jì)好的順序出現(xiàn)。但是,不是所有子組件都必須有。可以只用一部分,例如:
CN=Steve Meier, OU=SunSoft, O=Sun, C=US
如果特征名字符串的值含有逗號(hào),當(dāng)在命令行指定該字符串時(shí),逗號(hào)必須用“\”字符來進(jìn)行轉(zhuǎn)義,如下所示: ?? cn=peter schuster, o=Sun Microsystems\, Inc., o=sun, c=us
在命令行中指定特征名字符串是不必要的。如果某一命令需要指定特征名字符串,而在命令行中又未提供,則用戶將得到每個(gè)子組件的提示。這種情況下,逗號(hào)不需要用“\”來轉(zhuǎn)義。
Internet RFC 1421 證書編碼標(biāo)準(zhǔn)
證書常用 Internet RFC 1421 標(biāo)準(zhǔn)中定義的可打印的編碼格式來存儲(chǔ),而不是用其二進(jìn)制編碼來存儲(chǔ)。這種證書格式,也稱“Base 64 編碼”,便于通過電子郵件或其它機(jī)制將證書導(dǎo)出到別的應(yīng)用程序中。
用 -import 和 -printcert 命令讀入的證書可以是這種格式的編碼或是二進(jìn)制格式的編碼。
缺省情況下,-export 命令將以二進(jìn)制編碼格式輸出證書,但如果指定了 -rfc 選項(xiàng),則將以可打印的編碼格式輸出證書。
缺省情況下,-list 命令打印證書的 MD5 指紋。而如果指定了 -v 選項(xiàng),將以可讀格式打印證書,如果指定了 -rfc 選項(xiàng),將以可打印的編碼格式輸出證書。
在其可打印的編碼格式中,已編碼證書的起始行是:
-----BEGIN CERTIFICATE-----
結(jié)束行是: -----END CERTIFICATE-----
證書鏈
keytool 可創(chuàng)建和管理密鑰倉庫的“密鑰”項(xiàng),每個(gè)密鑰項(xiàng)都含有私鑰和相關(guān)證書“鏈”。鏈中的第一個(gè)證書含有與私鑰對(duì)應(yīng)的公鑰。
當(dāng)?shù)谝淮萎a(chǎn)生密鑰時(shí)(參見 -genkey 命令),鏈中只含有一個(gè)元素,即自簽名證書。自簽名證書是一個(gè)這樣的證書:其簽發(fā)人(簽名人)與主體(證書所認(rèn)證的公鑰所屬的實(shí)體)相同。當(dāng)調(diào)用 -genkey 命令來生成新的公鑰/私鑰對(duì)時(shí),它同時(shí)也把公鑰打包進(jìn)自簽名證書中。
之后,當(dāng)證書簽名請(qǐng)求 (CSR) (參見 -certreq 命令)被生成并送至認(rèn)證機(jī)構(gòu) (CA) 后,CA 的答復(fù)將被導(dǎo)入(參見 -import),證書鏈將取代自簽名證書。在鏈的底部是認(rèn)證主體公鑰的 CA 所發(fā)放的證書(答復(fù))。鏈中下一個(gè)證書是用于認(rèn)證 CA 公鑰的證書。
在許多情況下,這是個(gè)自簽名證書(即來自認(rèn)證其自身公鑰的 CA 的證書)且是鏈中的最后一個(gè)證書。在其它情況下,CA 也許將返回證書鏈。這種情況下,鏈中底部的證書是相同的(由 CA 簽名的證書,對(duì)密鑰項(xiàng)的公鑰進(jìn)行認(rèn)證),但鏈中第二個(gè)證書是由不同的 CA 所簽名的,對(duì)您向其發(fā)送 CSR 的 CA 的公鑰進(jìn)行認(rèn)證。然后,鏈中的下一個(gè)證書將是對(duì)第二個(gè) CA 的公鑰進(jìn)行認(rèn)證的證書,以此類推,直至到達(dá)自簽名的“根”證書為止。因此,鏈中的每個(gè)證書(從第一個(gè)以后)都對(duì)鏈中前一個(gè)證書的簽名人的公鑰進(jìn)行認(rèn)證。
許多 CA 只返回所發(fā)放的證書,而不支持鏈,特別是當(dāng)層次結(jié)構(gòu)較簡單時(shí)(無中介 CA)。這種情況下,必須用儲(chǔ)存在密鑰倉庫中的可信任的證書信息來建立證書鏈。
另一種答復(fù)格式(由 PKCS#7 標(biāo)準(zhǔn)所定義)除了包含所簽發(fā)的證書外,還支持證書鏈。兩種答復(fù)格式都可由 keytool 處理。
頂層(根)CA 證書是自簽名的。但是,對(duì)根公鑰的信任并非來自根證書本身(任何人都可用特征名來產(chǎn)生自簽名證書!譬如說用 VeriSign 根 CA 的特征名), 而是來自報(bào)紙之類的其它來源。根 CA 的公鑰是廣為人知的。它被儲(chǔ)存在證書中的唯一原因是因?yàn)檫@是大多數(shù)工具所能理解的格式,因此這種情況下的證書只是作為一種傳輸根 CA 的公鑰用的“交通工具”。在將根 CA 證書加到您的密鑰倉庫中之前,應(yīng)該先對(duì)它進(jìn)行查看(用 -printcert 選項(xiàng))并將所顯示的指紋與已知的指紋(從報(bào)紙、根 CA 的網(wǎng)頁等中獲取)進(jìn)行比較。
導(dǎo)入證書
要從一個(gè)文件中導(dǎo)入某個(gè)證書,可用 -import 命令,如下所示: ??? keytool -import -alias joe -file jcertfile.cer
此樣本命令導(dǎo)入文件 jcertfile.cer 中的證書并將其存儲(chǔ)在由別名 joe 標(biāo)識(shí)的密鑰倉庫項(xiàng)中。
導(dǎo)入證書的兩個(gè)理由如下:
?
- 為將其添加到可信任的證書清單中,或
- 為導(dǎo)入因向 CA 提交證書簽名請(qǐng)求(參見 -certreq 命令)而收到的來自該 CA 的認(rèn)證答復(fù)。
-alias 選項(xiàng)的值指明要進(jìn)行何種類型的導(dǎo)入。如果數(shù)據(jù)庫中存在別名,且該別名標(biāo)識(shí)具有私鑰的項(xiàng),則將假定您要導(dǎo)入認(rèn)證答復(fù)。keytool 將檢查認(rèn)證答復(fù)中的公鑰是否與用別名儲(chǔ)存的私鑰相匹配,如果兩者不同,則程序退出。如果別名標(biāo)識(shí)另一種類型的密鑰倉庫項(xiàng),則不導(dǎo)入該證書。如果該別名不存在,則它將被創(chuàng)建并與導(dǎo)入的證書關(guān)聯(lián)。
有關(guān)導(dǎo)入可信任證書的警告
重要:將證書作為可信任的證書導(dǎo)入之前,請(qǐng)務(wù)必先仔細(xì)檢查該證書!
先查看一下(用 -printcert 命令,或用不帶 -noprompt 選項(xiàng)的 -import 命令),確保所顯示的證書指紋與所預(yù)計(jì)的相匹配。例如,假設(shè)某人給您送來或用電子郵件發(fā)來一個(gè)證書,您將它放在名為 /tmp/cert 的文件中。在將它加到可信任證書的清單中之前,可通過執(zhí)行 -printcert 命令來查看它的指紋,如下所示:
? keytool -printcert -file /tmp/cert
??? Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
??? Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
??? Serial Number: 59092b34
??? Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997
??? Certificate Fingerprints:
???????? MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F
???????? SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE
然后給向您發(fā)送證書的人打電話或用其它方式聯(lián)系,將您將您所看到的指紋與他們所提供的比較。只有兩者相等才可保證證書在傳送途中沒有被其它人(例如,攻擊者)的證書所更換。如果發(fā)生了這樣的攻擊,而您未檢查證書即將其導(dǎo)入,您就會(huì)信任攻擊者所簽名的任何東西(例如,一個(gè)含有惡意類文件的 JAR 文件)。
注意:并不要求在導(dǎo)入證書前執(zhí)行 -printcert 命令,因?yàn)樵趯⒆C書添加到密鑰倉庫中可信任證書的清單中之前,-import 命令將會(huì)打印出該證書的信息,并提示您進(jìn)行校驗(yàn)。這時(shí),您可選擇中止導(dǎo)入操作。但是注意,只有在調(diào)用不帶 -noprompt 選項(xiàng)的 -import 命令時(shí)才能這樣做。如果給出了 -noprompt 選項(xiàng),則不存在與用戶的交互
導(dǎo)出證書
要將證書導(dǎo)出到文件中,請(qǐng)用 -export 命令,如下所示: ??? keytool -export -alias jane -file janecertfile.cer
該樣本命令將 jane 的證書導(dǎo)出到文件 janecertfile.cer 中。也就是說,如果 jane 是某個(gè)密鑰項(xiàng)的別名,該命令將導(dǎo)出該密鑰倉庫項(xiàng)中所含證書鏈底部的證書。這是認(rèn)證 jane 的公鑰用的證書。
相反,如果 jane 是某個(gè)可信任證書項(xiàng)的別名,則導(dǎo)出的是該可信任的證書。
顯示證書
要打印某個(gè)密鑰倉庫項(xiàng)的內(nèi)容,請(qǐng)用 -list 命令,如下所示: ??? keytool -list -alias joe
如果未指定別名,如下所示: ??? keytool -list
則打印整個(gè)密鑰倉庫的內(nèi)容。
要顯示儲(chǔ)存在文件中的證書的內(nèi)容,請(qǐng)用 -printcert 命令,如下所示:
??? keytool -printcert -file certfile.cer
這將打印儲(chǔ)存在文件 certfile.cer 中的有關(guān)證書的信息。
注意:此操作與密鑰倉庫無關(guān),也就是說,不需要密鑰倉庫即可顯示儲(chǔ)存在文件中的證書。
生成自簽名證書
自簽名證書是一個(gè)這樣的證書:其簽發(fā)人(簽名人)與主體(證書所認(rèn)證的公鑰所屬的實(shí)體)相同。當(dāng)調(diào)用 -genkey 命令來生成新的公鑰/私鑰對(duì)時(shí),它同時(shí)也把公鑰打包進(jìn)自簽名證書中。
有時(shí)您也許希望生成新的自簽名證書。例如,您也許想對(duì)不同身份(特征名)使用相同的密鑰對(duì)。例如,假設(shè)您換了個(gè)部門。此時(shí)您可以:
?
- 復(fù)制原始的密鑰項(xiàng)。請(qǐng)參見 -keyclone。
- 用新特征名為該復(fù)制項(xiàng)生成新的自簽名證書。參見下文。
- 為該復(fù)制項(xiàng)生成證書簽名請(qǐng)求,并導(dǎo)入答復(fù)證書或證書鏈。參見 -certreq 和 -import 命令。
- 刪除原始(現(xiàn)在已過時(shí))項(xiàng)。參見 -delete 命令。
要生成自簽名證書,請(qǐng)用 -selfcert 命令,如下所示: ??? keytool -selfcert -alias dukeNew -keypass b92kqmp
????? -dname "cn=Duke Smith, ou=Purchasing, o=BlueSoft, c=US"
所生成的證書作為指定別名(本例中為“dukeNew”)所標(biāo)識(shí)的密鑰倉庫項(xiàng)中的單元素證書來存儲(chǔ),它將取代現(xiàn)有的證書鏈。