<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鷹翔宇空

    學(xué)習(xí)和生活

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

    ?

    本文引自:http://www.iplab.cs.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/keytool.html

    說明
    keytool是個(gè)密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對(duì)及相關(guān)證書,用于(通過數(shù)字簽名)自我認(rèn)證(用戶向別的用戶/服務(wù)認(rèn)證自己)或數(shù)據(jù)完整性以及認(rèn)證服務(wù)。它還允許用戶儲(chǔ)存他們的通信對(duì)等者的公鑰(以證書形式)。

    證書是來自一個(gè)實(shí)體(個(gè)人、公司等)的經(jīng)數(shù)字簽名的聲明,它聲明某些其它實(shí)體的公鑰(及其它信息)具有某一的特定值(參見證書)。當(dāng)數(shù)據(jù)被數(shù)字化簽名后,校驗(yàn)簽名即可檢查數(shù)據(jù)的完整性和真實(shí)性。完整性的意思是數(shù)據(jù)沒有被修改或損壞過,真實(shí)性的意思是數(shù)據(jù)的確是來自聲稱創(chuàng)建了該數(shù)據(jù)和對(duì)它進(jìn)行了簽名的實(shí)體。

    keytool將密鑰和證書儲(chǔ)存在一個(gè)所謂的密鑰倉庫中。缺省的密鑰倉庫實(shí)現(xiàn)將密鑰倉庫實(shí)現(xiàn)為一個(gè)文件。它用口令來保護(hù)私鑰。

    jarsigner 工具利用密鑰倉庫中的信息來產(chǎn)生或校驗(yàn) Java 存檔 (JAR) 文件的數(shù)字簽名 (JAR 文件將類文件、圖象、聲音和/或其它數(shù)字化數(shù)據(jù)打包在一個(gè)文件中)。jarsigner 用 JAR 文件所附帶的證書(包含于 JAR 文件的簽名塊文件中)來校驗(yàn) JAR 文件的數(shù)字簽名,然后檢查該證書的公鑰是否“可信任”,即是否包括在指定的密鑰倉庫中。

    請(qǐng)注意:keytool和 jarsigner 工具完全取代了 JDK 1.1 中提供的 javakey 工具。這些新工具所提供的功能比 javakey 提供的多,包括能夠用口令來保護(hù)密鑰倉庫和私鑰,以及除了能夠生成簽名外還可以校驗(yàn)它們。新的密鑰倉庫體系結(jié)構(gòu)取代了 javakey 所創(chuàng)建和管理的身份數(shù)據(jù)庫。可以利用 -identitydbkeytool命令將信息從身份數(shù)據(jù)庫導(dǎo)入 密鑰倉庫。

    密鑰倉庫項(xiàng)

    在密鑰倉庫中有兩種不同類型的項(xiàng):
      ?
    1. 密鑰項(xiàng) - 每項(xiàng)存放極為敏感的加密密鑰信息,這種信息以一種受保護(hù)的格式儲(chǔ)存以防止未授權(quán)的訪問。通常,儲(chǔ)存在這類項(xiàng)中的密鑰是機(jī)密密鑰,或是伴有用于認(rèn)證相應(yīng)公鑰用的證書“鏈”的私鑰。keytooljarsigner 工具只處理后一類型的項(xiàng),即私鑰及其關(guān)聯(lián)的證書鏈。
    2. 可信任的證書項(xiàng) - 每項(xiàng)包含一個(gè)屬于另一團(tuán)體的公鑰證書。它之所以叫做“可信任的證書”,是因?yàn)槊荑€倉庫的擁有者相信證書中的公鑰確實(shí)屬于證書“主體”(擁有者)識(shí)別的身份。證書簽發(fā)人通過對(duì)證書簽名來保證這點(diǎn)。

    密鑰倉庫使用的別名

    對(duì)所有的密鑰倉庫項(xiàng)(密鑰項(xiàng)和可信任的證書項(xiàng))的訪問都要通過唯一的別名來進(jìn)行。別名不區(qū)分大小寫,即別名 Hugohugo 指的是同一密鑰倉庫項(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)著任何人的面鍵入口令。

    密鑰倉庫位置

    每個(gè) keytool 命令都有一個(gè) -keystore 選項(xiàng),用于指定 keytool 管理的密鑰倉庫的永久密鑰倉庫文件名稱及其位置。缺省情況下,密鑰倉庫儲(chǔ)存在用戶宿主目錄(由系統(tǒng)屬性的“user.home”決定)中名為 .keystore 的文件中。在 Solaris 系統(tǒng)中“user.home”缺省為用戶的宿主目錄。

    密鑰倉庫的創(chuàng)建

    當(dāng)用 -genkey-import-identitydb 命令向某個(gè)尚不存在的密鑰倉庫添加數(shù)據(jù)時(shí),就創(chuàng)建了一個(gè)密鑰倉庫。

    具體地說,如果在 -keystore 選項(xiàng)中指定了一個(gè)并不存在的密鑰倉庫,則該密鑰倉庫將被創(chuàng)建。

    如果不指定 -keystore 選項(xiàng),則缺省密鑰倉庫將是宿主目錄中名為 .keystore 的文件。如果該文件并不存在,則它將被創(chuàng)建。

    密鑰倉庫實(shí)現(xiàn)

    java.security 包中提供的 KeyStore 類為訪問和修改密鑰倉庫中的信息提供了相當(dāng)固定的接口。可以有多個(gè)不同的具體實(shí)現(xiàn),其中每個(gè)實(shí)現(xiàn)都是對(duì)某個(gè)特定類型的密鑰倉庫的具體實(shí)現(xiàn)。

    目前,有兩個(gè)命令行工具(keytooljarsigner)以及一個(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)換為文件輸入流,從該文件輸入流中加載密鑰倉庫信息)。另一方面,jarsignerpolicytool 工具可從任何可用 URL 指定的位置讀取某個(gè)密鑰倉庫。

    對(duì)于 keytooljarsigner,可在命令行用 -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”相同的。

    支持的算法和密鑰大小

    keytool 允許用戶指定任何注冊(cè)了的加密服務(wù)提供者所提供的密鑰對(duì)生成和簽名算法。也就是說,各種命令中的 keyalgsigalg 選項(xiàng)必須得到提供者的實(shí)現(xiàn)的支持。缺省的密鑰對(duì)生成算法是“DSA”。簽名算法是從所涉及私鑰的算法推導(dǎo)來的:如果所涉及的私鑰是“DSA”類型,則缺省的簽名算法為“SHA1withDSA”,如果所涉及的私鑰是“RSA”類型,則缺省的簽名算法為“MD5withRSA”。

    在生成 DSA 密鑰對(duì)時(shí),密鑰大小的范圍必須在 512 到 1024 位之間,且必須是 64 的倍數(shù)。缺省的密鑰大小為 1024 位。

    證書

    證書(也叫公鑰證書)是來自某個(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ù)量很多,例如 VeriSignThawteEntrust 等等。您還可以使用諸如 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è)理由如下:

      ?
    1. 為將其添加到可信任的證書清單中,或
    2. 為導(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í)您可以:

      ?
    1. 復(fù)制原始的密鑰項(xiàng)。請(qǐng)參見 -keyclone
    2. 用新特征名為該復(fù)制項(xiàng)生成新的自簽名證書。參見下文。
    3. 為該復(fù)制項(xiàng)生成證書簽名請(qǐng)求,并導(dǎo)入答復(fù)證書或證書鏈。參見 -certreq-import 命令。
    4. 刪除原始(現(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)有的證書鏈。

    命令和選項(xiàng)注意事項(xiàng)

    下面列出各種命令及其選項(xiàng),并對(duì)它們進(jìn)行描述。注意:
      ?
    • 所有的命令和選項(xiàng)名之前都有減號(hào) (-) 。
    • 每個(gè)命令的選項(xiàng)都可按任意順序提供。
    • 所有非斜體項(xiàng)或不在花括號(hào)和方括號(hào)內(nèi)的項(xiàng)都不能改動(dòng)。
    • 選項(xiàng)周圍的花括號(hào)通常表示如果在命令行中沒有指定該選項(xiàng),則使用缺省值。花括號(hào)還用在 -v-rfc-J 選項(xiàng)周圍,這些選項(xiàng)只有在命令行中出現(xiàn)時(shí)才有意義(也就是說,它們沒有任何缺省值,不然就是不存在該選項(xiàng))。
    • 選項(xiàng)周圍的方括號(hào)表示如果在命令行中沒有指定該選項(xiàng),則用戶將得到要求輸入其值的提示。(對(duì)于 -keypass 選項(xiàng),如果在命令行中沒有指定該選項(xiàng),keytool 將先是嘗試用密鑰倉庫口令來訪問私鑰,如果失敗,再提示您輸入私鑰口令。)
    • 斜體項(xiàng)(選項(xiàng))代表必須提供實(shí)際值。例如,下面是 -printcert 命令的格式:
      ? keytool -printcert {-file cert_file} {-v}
      當(dāng)指定 -printcert 命令時(shí),請(qǐng)用實(shí)際文件名來替代 cert_file,如下所示:
      ? keytool -printcert -file VScert.cer
    • 如果選項(xiàng)值含有空白(空格),必須用引號(hào)把它們括起來。
    • -help 命令是缺省命令。因此,命令行
      ? keytool
      等價(jià)于
      ? keytool -help

    選項(xiàng)缺省值

    下面是各選項(xiàng)的缺省值。
    -alias "mykey"
    
    -keyalg "DSA"
    
    -keysize 1024
    
    -validity 90
    
    -keystore 用戶宿主目錄中名為 .keystore 的文件
    
    -file 讀時(shí)為標(biāo)準(zhǔn)輸入,寫時(shí)為標(biāo)準(zhǔn)輸出
    簽名算法(-sigalg 選項(xiàng))是由所涉及私鑰的算法推導(dǎo)而來的:如果所涉及的私鑰是“DSA”類型,則 -sigalg 選項(xiàng)將缺省為“帶 DSA 的 SHA1”,如果所涉及的私鑰是“RSA”類型,則 -sigalg 選項(xiàng)將缺省為“帶 RSA 的 MD5”。

    出現(xiàn)在大多數(shù)命令中的選項(xiàng)

    -v 選項(xiàng)可出現(xiàn)在除 -help 之外的所有命令中。如果出現(xiàn)該選項(xiàng),表示處在“長格式”模式下;將輸出詳細(xì)的證書信息。

    -Jjavaoption 選項(xiàng)也可在任何命令中出現(xiàn)。如果出現(xiàn)該選項(xiàng),則所指定的 javaoption 字符串將被直接傳給 Java 解釋器。(keytool 實(shí)際上是解釋器周圍的一個(gè) “wrapper”。) 該選項(xiàng)不應(yīng)含有任何空格。它有助于調(diào)整執(zhí)行環(huán)境或內(nèi)存使用。要獲得可用的解釋器選項(xiàng)的清單,可在命令行鍵入 java -hjava -X

    有三個(gè)選項(xiàng)可出現(xiàn)在用于操作密鑰倉庫的所有命令中:

    ?
    -storetype storetype
    此限定符指定將被實(shí)例化的密鑰倉庫類型。缺省的密鑰倉庫類型是安全屬性文件中“keystore.type”屬性值所指定的那個(gè)類型,由 java.security.KeyStore 中的靜態(tài)方法 getDefaultType 返回。
    -keystore keystore
    密鑰倉庫(數(shù)據(jù)庫文件)的位置。缺省情況下,密鑰倉庫指的是用戶宿主目錄的 .keystore 文件,它是由“user.home”的系統(tǒng)屬性確定的。在 Solaris 系統(tǒng)中,“user.home”缺省為用戶宿主目錄。
    -storepass storepass
    口令,用來保護(hù)密鑰倉庫的完整性。


    storepass 的長度必須至少為 6 個(gè)字符。所有訪問密鑰倉庫內(nèi)容的命令都必須提供這一選項(xiàng)。對(duì)于這些命令,如果沒有給出 -storepass 選項(xiàng),則用戶將得到要求輸入該選項(xiàng)的提示。

    當(dāng)從密鑰倉庫中檢索信息時(shí),口令屬于可選項(xiàng);如果未給出口令,就不能檢查所檢索信息的完整性,而且將出現(xiàn)警告。

    使用口令時(shí)必須小心 - 參見與口令有關(guān)的警告

    與口令有關(guān)的警告

    大多數(shù)對(duì)密鑰倉庫操作的命令都要求倉庫口令。一些命令要求私鑰口令。

    口令可以在命令行上(分別在 -storepass-keypass 選項(xiàng)上)指定。但是,除非是作為測試目的或是在一個(gè)安全的系統(tǒng)上,否則不應(yīng)在命令行或腳本中指定口令。

    如果沒有在命令行上指定所要求的口令選項(xiàng),您將會(huì)得到要求輸入口令的提示。當(dāng)在口令提示符下鍵入口令時(shí),口令將被即時(shí)地顯示出來(鍵入什么就顯示什么),因此,要小心,不要當(dāng)著任何人的面鍵口令。

    命令

    另請(qǐng)參閱命令和選項(xiàng)注釋

    向密鑰倉庫添加數(shù)據(jù)

    -genkey {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    產(chǎn)生密鑰對(duì)(公鑰和與之關(guān)聯(lián)的私鑰)。將公鑰打包進(jìn) X.509 v1 的自簽名證書中,該證書以單元素證書鏈的形式儲(chǔ)存。該證書鏈和私鑰將儲(chǔ)存于 alias 所標(biāo)識(shí)的新密鑰倉庫項(xiàng)中。


    keyalg 指定了用于生成密鑰對(duì)的算法,而 keysize 指定要生成的每個(gè)密鑰的大小。sigalg 指定簽名自簽名證書所用的算法;這一算法必須與 keyalg 兼容。參見支持的算法和密鑰大小

    dname 指定與 alias 關(guān)聯(lián)的 X.500 特征名,并用作自簽名證書中的 issuersubject 域。如果在命令行中沒有提供特征名,用戶將得到要求輸入該信息的提示。

    keypass 是口令,用來保護(hù)所生成密鑰對(duì)中的私鑰。如果沒有提供口令,用戶將得到要求輸入口令的提示。如果在提示符下按 RETURN 鍵,則密鑰口令將被設(shè)置為與密鑰倉庫所用的口令相同。keypass 的長度必須至少為 6 個(gè)字符。使用口令時(shí)必須小心 - 參見 與口令有關(guān)的警告

    valDays 指定證書的有效期。

    -import {-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    從文件 cert_file 中讀取證書或證書鏈(后者在 PKCS#7 格式的答復(fù)所給出)并將其儲(chǔ)存在 alias 所標(biāo)識(shí)的密鑰倉庫項(xiàng)中。如果沒有給出文件,則從標(biāo)準(zhǔn)輸入設(shè)備中讀取證書或 PKCS#7 答復(fù)。keytool 可導(dǎo)入 X.509 v1、v2 和 v3 的證書以及由該類證書所組成的 PKCS#7 格式的證書鏈。要導(dǎo)入的數(shù)據(jù)必須是二進(jìn)制編碼格式或 Internet RFC 1421 標(biāo)準(zhǔn)所定義的可打印的編碼格式(也稱 Base64 編碼)。在后一種情況下,編碼必須用以“-----BEGIN”開頭的字符串開始,用以“-----END”結(jié)尾的字符串來結(jié)束。


    當(dāng)導(dǎo)入新的可信任證書時(shí),密鑰倉庫中還沒有 alias。在把證書添加到密鑰倉庫中之前,keytool 將嘗試用密鑰倉庫中已有的可信任證書來構(gòu)造從該證書到自簽名證書(屬于根 CA)的信任鏈,以對(duì)證書進(jìn)行校驗(yàn)。

    如果指定了 -trustcacerts 選項(xiàng),則將為該信任鏈考慮其它證書,即考慮名為“cacerts”的文件中的證書,該文件位于 JDK 安全屬性目錄 java.home\lib\security 中,其中 java.home 為 JDK 安裝目錄。“cacerts”文件代表含有 CA 證書的系統(tǒng)范圍的密鑰倉庫。通過指定密鑰倉庫類型為“jks”,系統(tǒng)管理員可用 keytool 來配置和管理該文件。“cacerts”密鑰倉庫文件發(fā)送時(shí)附有五個(gè) VeriSign 根 CA 證書,其 X.500 特征名如下:

    1. OU=Class 1 Public Primary Certification Authority, O="VeriSign, Inc.",
    C=US
    
    2. OU=Class 2 Public Primary Certification Authority, O="VeriSign,
    Inc.", C=US
    
    3. OU=Class 3 Public Primary Certification Authority,
    O="VeriSign, Inc.", C=US
    
    4. OU=Class 4 Public Primary Certification
    Authority, O="VeriSign, Inc.", C=US
    
    5. OU=Secure Server Certification
    Authority, O="RSA Data Security, Inc.", C=US
    “cacerts”密鑰倉庫文件的初始口令為“changeit” 。系統(tǒng)管理員在安裝 JDK 后,就應(yīng)該立即更改這個(gè)口令以及該文件的缺省訪問權(quán)限。

    如果 keytool 無法建立從要導(dǎo)入的證書到自簽名證書的信任路徑(利用密鑰倉庫或“cacerts”文件),則打印出該證書的信息,而用戶將得到要求校驗(yàn)的提示,例如,系統(tǒng)將通知用戶通過比較顯示出的指紋和得自其它(可信任的)信息來源的指紋來進(jìn)行校驗(yàn),信息來源可能是證書擁有者本人。在將證書作為一個(gè)“可信任”證書導(dǎo)入之前,要十分小心,務(wù)必保證該證書是有效的! -- 參見有關(guān)導(dǎo)入可信任證書的警告。然后,用戶可以選擇中止導(dǎo)入操作。但是,如果給了 -noprompt 選項(xiàng),則不會(huì)有與用戶的交互。

    當(dāng)導(dǎo)入認(rèn)證答復(fù)時(shí),該認(rèn)證答復(fù)將用密鑰倉庫中可信任的證書來確認(rèn),有時(shí)也使用在“cacerts”密鑰倉庫文件中配置的證書(如果指定了 -trustcacerts 選項(xiàng))。

    如果答復(fù)是一個(gè) X.509 證書,keytool 將嘗試建立信任鏈,以該認(rèn)證答復(fù)為頭,以屬于根 CA 的自簽名證書為尾。該認(rèn)證答復(fù)和用于認(rèn)證該認(rèn)證答復(fù)的證書層次形成了 alias 的新證書鏈。

    如果答復(fù)是 PKCS#7 格式的證書鏈,則該鏈應(yīng)首先被排序(用戶證書在最前面,自簽名的根 CA 證書在最后面),然后 keytool 嘗試將答復(fù)中的根 CA 證書與密鑰倉庫或“cacerts”密鑰倉庫文件(如果指定了 -trustcacerts 選項(xiàng))中的任何可信任證書進(jìn)行匹配。如果找不到匹配,則打印出該根 CA 證書的信息,而用戶將得到要求校驗(yàn)它的提示,例如,系統(tǒng)將通知用戶通過比較顯示出的指紋和得自其它(可信任的)信息來源的指紋來進(jìn)行校驗(yàn),信息來源可能是證書擁有者本人。因此,用戶可以選擇中止導(dǎo)入操作。但是,如果給了 -noprompt 選項(xiàng),則不會(huì)有與用戶的交互。

    alias 的新證書鏈將取代與該項(xiàng)關(guān)聯(lián)的舊證書鏈。只有提供了有效的 keypass,即提供了用于保護(hù)該項(xiàng)的私鑰的口令時(shí),舊鏈才可被取代。如果沒有提供口令,而且私鑰口令與密鑰倉庫口令不同,用戶將得到要求輸入口令的提示。使用口令時(shí)必須小心 --? 參見與口令有關(guān)的警告

    -selfcert {-alias alias} {-sigalg sigalg} {-dname dname} {-validity valDays} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    利用密鑰倉庫信息(包括與 alias 關(guān)聯(lián)的私鑰和公鑰)產(chǎn)生 X.509 v1 自簽名證書。如果在命令行提供了 dname,它將同時(shí)用作該證書的簽發(fā)人和主體的 X.500 特征名。否則,將使用與 alias 關(guān)聯(lián)的 X.500 特征名(位于其現(xiàn)有證書鏈底部)。


    所生成的證書作為 alias 所標(biāo)識(shí)的密鑰倉庫項(xiàng)中的單元素證書鏈來存儲(chǔ),它將取代現(xiàn)有的證書鏈。

    sigalg 指定簽名證書用的算法。參見支持的算法和密鑰大小

    要訪問私鑰,必須提供正確的口令,因?yàn)樗借€在密鑰倉庫中是受口令保護(hù)的。如果在命令行中沒有提供 keypass,且私鑰口令與保護(hù)密鑰倉庫完整性所用的口令不同,則用戶將得到要求輸入該口令的提示。使用口令時(shí)必須小心 -- 參見與口令有關(guān)的警告

    valDays 指定證書的有效期。

    -identitydb {-file idb_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    idb_file 文件中讀取 JDK 1.1.x 格式的身份數(shù)據(jù)庫,并將它的項(xiàng)加到密鑰倉庫中。如果沒有給出文件名,則從標(biāo)準(zhǔn)輸入設(shè)備中讀取身份數(shù)據(jù)庫。如果不存在密鑰倉庫,則創(chuàng)建它。


    只有被標(biāo)記為可信任的身份數(shù)據(jù)庫項(xiàng)(“身份”)才能被導(dǎo)入密鑰倉庫中。所有其它身份都將被略去。對(duì)每個(gè)可信任的身份,將創(chuàng)建一個(gè)密鑰倉庫項(xiàng)。身份名用作該密鑰倉庫項(xiàng)的“別名”。

    所有可信任身份的私鑰都將在相同的口令 storepass 下得到加密。該口令與保護(hù)密鑰倉庫完整性所用的口令相同。用戶隨后可用 keytool 命令選項(xiàng)“-keypasswd”來對(duì)各私鑰賦予單獨(dú)的口令。

    身份數(shù)據(jù)庫中的一個(gè)身份可以存放多個(gè)證書,各證書所認(rèn)證的都是同一公鑰。但一個(gè)私鑰的密鑰倉庫密鑰項(xiàng)含有該私鑰和單一的“證書鏈”(該鏈最初只有一個(gè)證書),鏈中的第一個(gè)證書含有與該私鑰對(duì)應(yīng)的公鑰。當(dāng)從身份導(dǎo)入信息時(shí),只有該身份中的第一個(gè)證書被儲(chǔ)存到密鑰倉庫中。這是因?yàn)樯矸輸?shù)據(jù)庫中的身份名被用作其相應(yīng)密鑰倉庫項(xiàng)的別名,而別名在密鑰倉庫中是唯一的。

    導(dǎo)出數(shù)據(jù)

    -certreq {-alias alias} {-sigalg sigalg} {-file certreq_file} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    生成 PKCS#10 格式的證書簽名請(qǐng)求 (CSR)。


    CSR 用來發(fā)送給認(rèn)證機(jī)構(gòu) (CA)。CA 對(duì)認(rèn)證請(qǐng)求者進(jìn)行認(rèn)證(通常是離線的),并返回證書或證書鏈,以取代密鑰倉庫中現(xiàn)有的證書鏈(該證書鏈最初只含有自簽名證書)。

    私鑰和與 alias 關(guān)聯(lián)的 X.500 特征名用于創(chuàng)建 PKCS#10 證書請(qǐng)求。要訪問私鑰,必須提供正確的口令,因?yàn)樗借€在庫中是受口令保護(hù)的。如果在命令行沒有提供 keypass,且私鑰口令與保護(hù)密鑰倉庫完整性所用的口令不同,則用戶將得到要求輸入口令的提示。

    使用口令時(shí)必須小心 -- 參見與口令有關(guān)的警告

    sigalg 指定簽名 CSR 時(shí)用的算法。參見支持的算法和密鑰大小

    CSR 存儲(chǔ)在文件 certreq_file 中。如果沒有給出文件名,CSR 將被輸出到標(biāo)準(zhǔn)輸出設(shè)備中。

    import 命令來導(dǎo)入 CA 所返回的答復(fù)。

    -export {-alias alias} {-file cert_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-rfc} {-v} {-Jjavaoption}
    從密鑰倉庫中讀取與 alias 關(guān)聯(lián)的證書,并將其儲(chǔ)存在文件 cert_file 中。


    如果沒有給出文件名,證書將被輸出到標(biāo)準(zhǔn)輸出設(shè)備中。

    缺省情況下,證書被輸出為二進(jìn)制編碼格式,但如果指定了 -rfc 選項(xiàng),則將被輸出為 Internet RFC 1421 標(biāo)準(zhǔn)中定義的可打印格式。

    如果 alias 引用的是可信任證書,則該證書將被輸出。否則,alias 引用的是含有相關(guān)證書鏈的密鑰項(xiàng)。在這種情況下,鏈中的第一個(gè)證書將被返回。該證書對(duì)由 alias 所指定的實(shí)體的公鑰進(jìn)行認(rèn)證。

    顯示數(shù)據(jù)

    -list {-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v | -rfc} {-Jjavaoption}
    打印(到標(biāo)準(zhǔn)輸出設(shè)備中)alias 所標(biāo)識(shí)的密鑰倉庫項(xiàng)的內(nèi)容。如果沒有指定別名,則將打印整個(gè)密鑰倉庫的內(nèi)容。


    缺省情況下,該命令打印證書的 MD5 指紋。如果指定了 -v 選項(xiàng),證書將以可讀格式打印,同時(shí)包含擁有者、簽發(fā)人和序列號(hào)等附加信息。如果指定了?-rfc 選項(xiàng),證書將以 Internet RFC 1421 標(biāo)準(zhǔn)所定義的可打印的編碼格式打印。

    不能同時(shí)指定 -v-rfc 兩個(gè)選項(xiàng)。

    -printcert {-file cert_file} {-v} {-Jjavaoption}
    從文件 cert_file 中讀取證書將以可讀格式打印其內(nèi)容。如果沒有給出文件名,則從標(biāo)準(zhǔn)輸入設(shè)備中讀取證書。


    證書可以是用二進(jìn)制編碼或 Internet RFC 1421 標(biāo)準(zhǔn)所定義的可打印編碼格式。

    注意:該選項(xiàng)的使用與密鑰倉庫無關(guān)。

    管理密鑰倉庫

    -keyclone {-alias alias} [-dest dest_alias] [-keypass keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    生成新的密鑰倉庫項(xiàng),該項(xiàng)含有的私鑰和證書鏈與原始項(xiàng)的相同。


    原始項(xiàng)由 alias (如果沒有提供別名,則其值缺省為“mykey”)標(biāo)識(shí)。新(目標(biāo))項(xiàng)由 dest_alias 標(biāo)識(shí)。如果沒有在命令行中提供目標(biāo)別名,用戶將得到要求輸入該信息的提示。

    如果私鑰口令與密鑰倉庫口令不同,那么,只有提供了有效的 keypass 時(shí)該項(xiàng)才能被復(fù)制。keypass 是用于保護(hù)與 alias 關(guān)聯(lián)的私鑰的口令。如果沒有在命令行提供密鑰口令,且私鑰口令與密鑰倉庫口令不同,用戶將得到要求輸入口令的提示。如果愿意,可用不同的口令來保護(hù)復(fù)制項(xiàng)中的私鑰。如果沒有在命令行提供 -new 選項(xiàng),用戶將得到提示要求輸入新項(xiàng)的口令(可以選擇讓該口令與被復(fù)制項(xiàng)的私鑰所用的口令相同)。

    使用口令時(shí)必須小心 -- 參見與口令有關(guān)的警告

    該命令可用于建立多個(gè)與給定密鑰對(duì)相對(duì)應(yīng)的證書鏈,或用于備份。

    -storepasswd [-new new_storepass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    更改保護(hù)密鑰倉庫內(nèi)容的完整性所用的口令。新口令為 new_storepass,其長度必須至少是 6 個(gè)字符。


    使用口令時(shí)必須小心 -- 參見與口令有關(guān)的警告

    -keypasswd {-alias alias} [-keypass old_keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    把保護(hù) alias 所標(biāo)識(shí)的私鑰的口令從 old_keypass 更改為 new_keypass


    如果沒有在命令行提供 keypass 選項(xiàng),且私鑰口令與密鑰倉庫口令不同,則用戶將得到要求輸入該口令的提示。

    如果沒有在命令行給出 -new 選項(xiàng),則用戶將得到要求輸入新口令的提示。

    使用口令時(shí)必須小心 -- 參見與口令有關(guān)的警告

    -delete [-alias alias] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
    從密鑰倉庫中刪除 alias 所標(biāo)識(shí)的項(xiàng)。如果沒有在命令行上提供別名,則用戶將得到要求輸入別名的提示。

    獲取幫助

    -help
    列出所有的命令及其選項(xiàng)。

    示例

    假設(shè)您要?jiǎng)?chuàng)建一個(gè)密鑰倉庫以管理您的公鑰/私鑰對(duì)來自您所信任實(shí)體的證書。

    生成密鑰對(duì)

    您首先要做的是創(chuàng)建一個(gè)密鑰倉庫和生成密鑰對(duì)。您可以使用以下命令:
    ??? keytool -genkey -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US"
    ????? -alias business -keypass kpi135 -keystore /working/mykeystore
    ????? -storepass ab987c -validity 180
    (請(qǐng)注意:鍵入該命令時(shí)必須使其成為一行。此處用多行來顯示,主要是為了可讀性。)

    該命令將在 C 盤的“working”目錄(假設(shè)它還不存在)中創(chuàng)建名為“mykeystore”的密鑰倉庫,并賦予它口令“ab987c”。它將為實(shí)體生成公鑰/私鑰對(duì),該實(shí)體的“特征名”為:常用名“Mark Jones”、組織單位“JavaSoft”、組織“Sun”和兩個(gè)字母的國家代碼“US”。它使用缺省的“DSA”密鑰生成算法來創(chuàng)建密鑰,兩個(gè)密鑰(公鑰與私鑰)的長度都是 1024 位。

    它創(chuàng)建自簽名證書(使用缺省的“帶 DSA 的 SHA1”簽名算法),該證書包括公鑰和特征名信息。該證書的有效期為 180 天,且與別名“business”所代表的密鑰倉庫項(xiàng)關(guān)聯(lián)。私鑰被賦予口令“kpi135”。

    如果采用選項(xiàng)的缺省值,可以大大縮短該命令。實(shí)際上,這些選項(xiàng)并不是必需的;對(duì)于有缺省值的選項(xiàng),未指定時(shí)將使用缺省值,對(duì)于任何被要求的值,您將會(huì)得到要求輸入它的提示。因此,您可以只使用下面的命令:

    ??? keytool -genkey
    這種情況下,將創(chuàng)建一個(gè)具有別名“mykey”的密鑰倉庫項(xiàng),它含有新生成的密鑰對(duì)和有效期為 90 天的證書。該項(xiàng)被放在您的宿主目錄下一個(gè)名為“.keystore”的密鑰倉庫中(如果該密鑰倉庫并不存在,則將創(chuàng)建它)。您將得到要求輸入特征名信息、密鑰倉庫口令和私鑰口令的提示。

    其余示例假設(shè)您執(zhí)行了未指定選項(xiàng)的 -genkey 命令,且用上述第一個(gè) -genkey 命令中給出的值來回答提示要求(私鑰口令為“kpi135”等等)。

    從認(rèn)證機(jī)構(gòu)請(qǐng)求已簽名的證書

    目前為止我們所具有的就是自簽名證書。證書如果由認(rèn)證機(jī)構(gòu) (CA) 簽名,將更有可能得到別人的信任。要得到這樣的簽名,首先要用以下命令生成證書簽名請(qǐng)求 (CSR):
    ??? keytool -certreq -file MarkJ.csr
    這將為缺省別名“mykey”所標(biāo)識(shí)的實(shí)體生成 CSR,并將此請(qǐng)求放在名為“MarkJ.csr”的文件中。將此文件提交給某個(gè) CA(例如 VeriSign, Inc.)。該 CA 將對(duì)您這個(gè)請(qǐng)求者進(jìn)行認(rèn)證(通常是離線的),然后返回它們所簽名的證書,用于認(rèn)證您的公鑰。(某些情況下,它們實(shí)際上將返回證書鏈,鏈中每個(gè)證書都認(rèn)證前一個(gè)證書的簽名人的公鑰。)

    導(dǎo)入 CA 的證書

    自簽名證書必須用證書鏈代替,鏈中的每個(gè)證書都認(rèn)證前一個(gè)證書的簽名人的公鑰,直到“根”CA 為止。

    在導(dǎo)入 CA 的答復(fù)之前,在您的密鑰倉庫中或 cacerts 密鑰倉庫文件(如導(dǎo)入命令中所述)中需要有一個(gè)或多個(gè)“可信任”證書:

      ?
    • 如果該認(rèn)證答復(fù)是個(gè)證書鏈,您只需要鏈中最頂部的證書(即用于認(rèn)證根 CA 的公鑰的“根” CA 證書)。
    • 如果該認(rèn)證答復(fù)是單個(gè)證書,您需要發(fā)放 CA(即簽名該證書的認(rèn)證機(jī)構(gòu))的證書,如果此證書不是自簽名的,則需其簽名人的證書,以此類推,直到自簽名的“根” CA 證書為止。
    “cacerts”密鑰倉庫文件發(fā)送時(shí)附有五個(gè) VeriSign 根 CA 證書,因此您可能并不需要導(dǎo)入 VeriSign 證書以作為密鑰倉庫中的可信任證書。但如果您請(qǐng)求由另一個(gè) CA 簽名的證書,而認(rèn)證該 CA 的公鑰的證書未被加到“cacerts”中,則您需要將來自該 CA 的證書作為“可信任證書”導(dǎo)入。

    來自 CA 的證書通常是自簽名的或是由另一個(gè) CA 簽名的(這種情況下您還需要認(rèn)證該 CA 的公鑰的證書)。假設(shè) ABC, Inc. 公司是 CA,而您從該公司獲得一個(gè)聲稱是自簽名證書的名為“ABCCA.cer”的文件,它用于認(rèn)證該 CA 的公鑰。

    在將證書作為一個(gè)“可信任”證書導(dǎo)入之前,要十分小心,務(wù)必保證該證書是有效的!先查看一下(用 keytool-printcert 命令,或用不帶 -noprompt 選項(xiàng)的 keytool-import 命令)以確保所顯示的證書指紋與所預(yù)計(jì)的相匹配。然后可以給發(fā)送證書的人打電話,將您所看到的指紋與他們所提供的(或安全公鑰儲(chǔ)存庫所顯示的)進(jìn)行比較。只有兩者相等才可保證證書在傳送途中沒有被其它人(例如,攻擊者)的證書所更換。如果發(fā)生了這樣的攻擊,而您未檢查證書即將其導(dǎo)入,那么您就會(huì)信任攻擊者所簽名的任何東西。

    如果您相信證書是有效的,則您可以用以下命令將其加到密鑰倉庫中:

    ??? keytool -import -alias abc -file ABCCA.cer
    這將在密鑰倉庫中用文件“ABCCA.cer”中的數(shù)據(jù)創(chuàng)建“可信任證書”項(xiàng),并將別名“abc”賦予該項(xiàng)。

    導(dǎo)入來自 CA 的認(rèn)證答復(fù)

    一旦導(dǎo)入了用于認(rèn)證 CA(該 CA 是您將證書簽名請(qǐng)求送往之處)公鑰的證書后,或在“cacerts”文件中已有這種證書時(shí),就可以導(dǎo)入該認(rèn)證答復(fù),從而用證書鏈取代您的自簽名證書。如果 CA 的答復(fù)是證書鏈,則該鏈?zhǔn)?CA 響應(yīng)您的請(qǐng)求而返回的證書鏈;如果 CA 的答復(fù)是一個(gè)證書,則該鏈?zhǔn)怯谜J(rèn)證答復(fù)和可信任證書建立的證書鏈,這些可信任證書是密鑰倉庫(您要將認(rèn)證答復(fù)導(dǎo)入之處)或“cacerts”密鑰倉庫文件中已有的。

    例如,假設(shè)您將證書簽名請(qǐng)求送往 VeriSign。您可用以下命令來導(dǎo)入認(rèn)證答復(fù),該命令假定所返回的證書名為“VSMarkJ.cer”:

    ??? keytool -import -trustcacerts -file VSMarkJ.cer

    導(dǎo)出用于認(rèn)證您的公鑰的證書

    假設(shè)您用 jarsigner 工具來簽名 Java 歸檔 (JAR) 文件。需要使用這一文件的客戶機(jī)將認(rèn)證您的簽名。

    認(rèn)證簽名的一種方法是先將您的公鑰證書作為“可信任”項(xiàng)導(dǎo)入它們的密鑰倉庫中。您可以將證書導(dǎo)出并將其提供給客戶機(jī)。例如,假設(shè)項(xiàng)的別名為“mykey”,您可以用以下命令將您的證書導(dǎo)出到名為 MJ.cer 的文件中:

    ??? keytool -export -alias mykey -file MJ.cer
    有了該證書以及已被簽名的 JAR 文件,客戶機(jī)就可以用 jarsigner 工具來認(rèn)證您的簽名。

    更改特征名但保留密鑰對(duì)

    假設(shè),譬如說因?yàn)槟鷵Q了部門或搬到另一個(gè)城市去了而改變了您的特征名。如果愿意,您仍然可以使用您先前使用的公鑰/私鑰對(duì)而只對(duì)特征名進(jìn)行更新。例如,假設(shè)您的名字叫 Susan Miller,并用別名 sMiller 和以下的特征名創(chuàng)建了初始密鑰項(xiàng):
    ? "cn=Susan Miller, ou=Finance Department, o=BlueSoft, c=us"
    假設(shè)您從財(cái)務(wù)部門換到了會(huì)計(jì)部門。您仍然可使用先前所生成的公鑰/私鑰對(duì),而用以下方法對(duì)特征名進(jìn)行更新。首先,復(fù)制您的密鑰項(xiàng):
    ??? keytool -keyclone -alias sMiller -dest sMillerNew
    (您將得到要求輸入密鑰倉庫口令和初始密鑰口令及目標(biāo)密鑰口令的提示,因?yàn)樵诿钚袥]有提供這些信息。)現(xiàn)在,您需要更改與復(fù)制項(xiàng)關(guān)聯(lián)的證書鏈以使鏈中的第一個(gè)證書使用您的新特征名。先用相應(yīng)名稱生成自簽名證書:
    ??? keytool -selfcert -alias sMillerNew
    ????? -dname "cn=Susan Miller, ou=Accounting Department, o=BlueSoft, c=us"
    然后根據(jù)該新證書中的信息生成證書簽名請(qǐng)求:
    ??? keytool -certreq -alias sMillerNew
    當(dāng)您得到 CA 認(rèn)證答復(fù)后,將其導(dǎo)入:
    ??? keytool -import -alias sMillerNew -file VSSMillerNew.cer
    導(dǎo)入認(rèn)證答復(fù)后,您也許會(huì)要?jiǎng)h除使用舊特征名的初始密鑰項(xiàng):
    ??? keytool -delete -alias sMiller
    posted on 2006-03-18 15:11 TrampEagle 閱讀(1889) 評(píng)論(0)  編輯  收藏 所屬分類: 技術(shù)文摘
    主站蜘蛛池模板: 亚洲国产视频网站| 国产高清在线免费| 我要看WWW免费看插插视频| 亚洲AV福利天堂一区二区三| 免费人成又黄又爽的视频在线电影| 国产青草视频在线观看免费影院| 亚洲欧好州第一的日产suv| 相泽南亚洲一区二区在线播放| 性感美女视频免费网站午夜| 亚洲一区无码中文字幕| 一区二区三区免费在线观看| 亚洲精品成人a在线观看| 免费福利资源站在线视频| 亚洲成A人片77777国产| 成人福利在线观看免费视频| 亚洲中文字幕无码专区| 国产VA免费精品高清在线| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 香蕉大伊亚洲人在线观看| 最近免费中文字幕视频高清在线看| 亚洲看片无码在线视频| 免费看的黄色大片| 最新亚洲人成无码网www电影| 国产美女精品久久久久久久免费| 国产亚洲精品2021自在线| 亚洲AV无码乱码在线观看| 国产精品内射视频免费| 亚洲国产第一站精品蜜芽| 99热在线观看免费| 亚洲第一成年网站大全亚洲| 久久笫一福利免费导航| 亚洲人片在线观看天堂无码| 国产18禁黄网站免费观看| 一个人看的www免费高清| 亚洲AV永久纯肉无码精品动漫| 免费A级毛片无码专区| 亚洲一区二区三区精品视频| 日本免费一区二区三区最新vr| 日日摸夜夜添夜夜免费视频| 日韩va亚洲va欧洲va国产| 亚洲免费电影网站|