概念
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 位。
證書
證書(也叫公鑰證書)是來自某個實體(簽發人)的經數字簽名的聲明,它聲明另一實體(主體)的公鑰(及其它信息)具有某一特定的值。
下面詳細解釋本句中使用的主要術語:
公鑰
是與特定實體相關聯的數字。所有需要與該實體進行信任互動的人都應知道該數字。公鑰用於校驗簽名。
經數字簽名
如果某些數據經數字簽名,說明它們已與某一實體的“身份”存儲在一起,而且證明該實體的簽名知道這些數據。通過用該實體的私鑰進行繪製,這些數據就是不可偽造的了。
身份
用於聲明實體的一種手段。某些系統中,身份是公鑰,而在另一些系統中則可以是 Unix UID、電子郵件地址或 X.509 特徵名等等。
簽名
所謂簽名,就是用實體的(簽名人,在證書中也稱為簽發人)私鑰對某些數據進行計算。
私鑰
是一些數字,每個數字都應僅被以該數字作為私鑰的特定實體所知(即該數字應保密)。在所有公鑰密碼系統中,私鑰和公鑰均成對出現。在 DSA 等具體的公鑰密碼系統中,一個私鑰只對應一個公鑰。私鑰用於計算簽名。
實體
實體是您在某種程度上對其加以信任的個人、組織、程式、計算機、企業、銀行等。
通常,公鑰密碼系統需要訪問用戶的公鑰。在大型聯網環境中,並不能確保通信實體之間已經預先建立起關係,也無法確保受信任的儲存庫與所用的公鑰都存在。於是人們發明了證書作為公鑰分配問題的解決辦法。現在,認證機構 (CA) 可充當可信任的第三方。CA 是可信任的向其它實體簽名(發放)證書的實體(例如企業)。由於 CA 受法律協定約束,因此可認為它們只提供可靠有效的證書。公共認證機構數量很多,例如 VeriSign、Thawte、Entrust 等等。您還可以使用諸如 Netscape/Microsoft Certificate Servers 或 Entrust CA 等產品來自己運營認證機構。
使用 keytool 可以顯示、導入和導出證書。還可以產生自簽名證書。
keytool 目前處理 X.509證書。
X.509證書
X.509 標準規定了證書可以包含什麼信息,並說明了記錄信息的方法(數據格式)。除了簽名外,所有 X.509證書還包含以下數據:
版本
識別用於該證書的 X.509 標準的版本,該版本影響證書中所能指定的信息。迄今為止,已定義的版本有三個。keytool 可導入和導出 v1、v2 和 v3 版的證書。它只能生成 v1 版證書。
序列號
發放證書的實體有責任為證書指定序列號,以使其區別於該實體發放的其它證書。此信息用途很多。例如,如果某一證書被撤消,其序列號將放到證書撤消清單 (CRL) 中。
簽名算法標識符
用於標識 CA 簽名證書時所用的算法。
簽發人名稱
簽名證書的實體的 X.500 特徵名。它通常為一個 CA。使用該證書意味著信任簽名該證書的實體。注意:有些情況下(例如根或頂層 CA證書),簽發人會簽名自己的證書。
有效期
每個證書均只能在一個有限的時間段內有效。該有效期以起始日期和時間及終止日期和時間表示,可以短至幾秒或長至一世紀。所選有效期取決於許多因素,例如用於簽名證書的私鑰的使用頻率及願為證書支付的金錢等。它是在沒有危及相關私鑰的條件下,實體可以依賴公鑰值的預計時間。
主體名
證書可以識別其公鑰的實體名。此名稱使用 X.500 標準,因此在Internet中應是唯一的。它是實體的 X.500 特徵名 (DN),例如,
CN=Java Duke, OU=Java Software Division, O=Sun Microsystems Inc, C=US
(這些指主體的通用名、組織單位、組織和國家。)
公鑰信息
這是被命名實體的公鑰,同時包括指定該密鑰所屬公鑰密碼系統的算法標識符及所有相關的密鑰參數。
X.509 1 版 1988 年發布,已得到廣泛使用,是最常用的版本。
X.509 2 版引入了主體和簽發人唯一標識符的概念,以解決主體和/或簽發人名稱在一段時間後可能重複使用的問題。大多數證書監視文檔都極力建議不要重複使用主體或簽發人名稱,而且建議證書不要使用唯一標識符。版本 2證書尚未得到廣泛使用。
X.509 3 版是最新的版本(1996 年)。它支持擴展的概念,因此任何人均可定義擴展並將其納入證書中。現在常用的擴展包括:KeyUsage(僅限密鑰用於特殊目的,例如“只簽名”)和 AlternativeNames(允許其它身份也與該公鑰關聯,例如 DNS 名、電子郵件地址、IP 地址)。擴展可標記為“極重要”,以表示該擴展應被檢查並執行或使用。例如,如果某一證書將 KeyUsage 擴展標記為“極重要”,而且設定為“keyCertSign”,則在 SSL 通訊期間該證書出現時將被拒絕,因為該證書擴展表示相關私鑰應只用於簽名證書,而不應該用於 SSL。
證書中的所有數據均用兩個名為 ASN.1/DER 的相關標準進行編碼。抽象語法注釋 1 (Abstract Syntax Notation 1) 描述數據。確定性編碼規則 (Definite Encoding Rules) 描述儲存和傳輸該數據的唯一方式。
X.500 特徵名
X.500 特徵名用於標識實體,例如 X.509證書的 主體和簽發人(簽名人)域所命名的實體。keytool 支持以下的子組件:
commonName - 個人常用名,例如“Susan Jones”
organizationUnit - 小型組織(例如部門或分部)的名稱,例如“Purchasing”
organizationName - 大型組織的名稱,例如“ABCSystems, Inc.”
localityName - 地方(城市)名,例如“Palo Alto”
stateName - 州或省份名,例如“California”
country - 兩個字母的國家代碼,例如“CH”
當給出一個特徵名字元串作為 -dname 選項的值時,例如 -genkey 或 -selfcert 命令中的該選項,字元串必須為以下格式:
CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode
其中所有的斜體字代表實際值而上面的關鍵字是以下縮寫:
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
大小寫對關鍵字縮寫無關緊要。例如,“CN”、“cn”和“Cn”都將被當作是一樣的。
但順序是有關係的;每個子組件必須按設計好的順序出現。但是,不是所有子組件都必須有。可以只用一部分,例如:
CN=Steve Meier, OU=SunSoft, O=Sun, C=US
如果特徵名字元串的值含有逗號,當在命令行指定該字元串時,逗號必須用“\”字元來進行轉義,如下所示:
cn=peter schuster, o=Sun Microsystems\, Inc., o=sun, c=us
在命令行中指定特徵名字元串是不必要的。如果某一命令需要指定特徵名字元串,而在命令行中又未提供,則用戶將得到每個子組件的提示。這種情況下,逗號不需要用“\”來轉義。
Internet RFC 1421證書編碼標準
證書常用 Internet RFC 1421 標準中定義的可列印的編碼格式來存儲,而不是用其二進制編碼來存儲。這種證書格式,也稱“Base 64 編碼”,便於通過電子郵件或其它機制將證書導出到別的應用程式中。
用 -import 和 -printcert 命令讀入的證書可以是這種格式的編碼或是二進制格式的編碼。
預設情況下,-export 命令將以二進制編碼格式輸出證書,但如果指定了 -rfc 選項,則將以可列印的編碼格式輸出證書。
預設情況下,-list 命令列印證書的 MD5 指紋。而如果指定了 -v 選項,將以可讀格式列印證書,如果指定了 -rfc 選項,將以可列印的編碼格式輸出證書。
在其可列印的編碼格式中,已編碼證書的起始行是:
-----BEGIN CERTIFICATE-----
結束行是:
-----END CERTIFICATE-----
證書鏈
keytool 可創建和管理密鑰倉庫的“密鑰”項,每個密鑰項都含有私鑰和相關證書“鏈”。鏈中的第一個證書含有與私鑰對應的公鑰。
當第一次產生密鑰時(參見 -genkey 命令),鏈中只含有一個元素,即自簽名證書。它是一個這樣的證書:簽發人(簽名人)與主體(證書所認證的公鑰所屬的實體)相同。當調用 -genkey 命令來生成新的公鑰/私鑰對時,它同時也把公鑰打包進自簽名證書中。
之後,當證書籤名請求 (CSR) (參見 -certreq 命令)被生成並送至認證機構 (CA) 後,CA 的答覆將被導入(參見 -import),證書鏈將取代自簽名證書。在鏈的底部是認證主體公鑰的 CA 所發放的證書(答覆)。鏈中下一個證書是用於認證 CA公鑰的證書。
在許多情況下,這是個自簽名證書(即來自認證其自身公鑰的 CA 的證書)且是鏈中的最後一個證書。在其它情況下,CA 也許將返回證書鏈。這種情況下,鏈中底部的證書是相同的(由 CA 簽名的證書,對密鑰項的公鑰進行認證),但鏈中第二個證書是由不同的 CA 所簽名的,對您向其傳送 CSR 的 CA 的公鑰進行認證。然後,鏈中的下一個證書將是對第二個 CA 的公鑰進行認證的證書,以此類推,直至到達自簽名的“根”證書為止。因此,鏈中的每個證書(從第一個以後)都對鏈中前一個證書的簽名人的公鑰進行認證。
許多 CA 只返回所發放的證書,而不支持鏈,特別是當層次結構較簡單時(無中介 CA)。這種情況下,必須用儲存在密鑰倉庫中的可信任的證書信息來建立證書鏈。
另一種答覆格式(由 PKCS#7 標準所定義)除了包含所簽發的證書外,還支持證書鏈。兩種答覆格式都可由 keytool 處理。
頂層(根)CA證書是自簽名的。但是,對根公鑰的信任並非來自根證書本身(任何人都可用特徵名來產生自簽名證書!譬如說用 VeriSign 根 CA 的特徵名), 而是來自報紙之類的其它來源。根 CA 的公鑰是廣為人知的。它被儲存在證書中的唯一原因是因為這是大多數工具所能理解的格式,因此這種情況下的證書只是作為一種傳輸根 CA 的公鑰用的“交通工具”。在將根 CA證書加到您的密鑰倉庫中之前,應該先對它進行查看(用 -printcert 選項)並將所顯示的指紋與已知的指紋(從報紙、根 CA 的網頁等中獲取)進行比較。
導入證書
要從一個檔案中導入某個證書,可用 -import 命令,如下所示:
keytool -import -alias joe -file jcertfile.cer
此樣本命令導入檔案 jcertfile.cer 中的證書並將其存儲在由別名 joe 標識的密鑰倉庫項中。
導入證書的兩個理由如下:
為將其添加到可信任的證書清單中,或為導入因向 CA 提交證書籤名請求(參見 -certreq 命令)而收到的來自該 CA 的認證答覆。
-alias 選項的值指明要進行何種類型的導入。如果資料庫中存在別名,且該別名標識具有私鑰的項,則將假定您要導入認證答覆。keytool 將檢查認證答覆中的公鑰是否與用別名儲存的私鑰相匹配,如果兩者不同,則程式退出。如果別名標識另一種類型的密鑰倉庫項,則不導入該證書。如果該別名不存在,則它將被創建並與導入的證書關聯。
可信任證書
重要:將證書作為可信任的證書導入之前,請務必先仔細檢查該證書!
先查看一下(用 -printcert 命令,或用不帶 -noprompt 選項的 -import 命令),確保所顯示的證書指紋與所預計的相匹配。例如,假設某人給您送來或用電子郵件發來一個證書,您將它放在名為 /tmp/cert 的檔案中。在將它加到可信任證書的清單中之前,可通過執行 -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
然後給向您傳送證書的人打電話或用其它方式聯繫,將您將您所看到的指紋與他們所提供的比較。只有兩者相等才可保證證書在傳送途中沒有被其它人(例如,攻擊者)的證書所更換。如果發生了這樣的攻擊,而您未檢查證書即將其導入,您就會信任攻擊者所簽名的任何東西(例如,一個含有惡意類檔案的 JAR 檔案)。
注意:並不要求在導入證書前執行 -printcert 命令,因為在將證書添加到密鑰倉庫中可信任證書的清單中之前,-import 命令將會列印出該證書的信息,並提示您進行校驗。這時,您可選擇中止導入操作。但是注意,只有在調用不帶 -noprompt 選項的 -import 命令時才能這樣做。如果給出了 -noprompt 選項,則不存在與用戶的互動
導出證書
要將證書導出到檔案中,請用 -export 命令,如下所示:
keytool -export -alias jane -file janecertfile.cer
該樣本命令將 jane 的證書導出到檔案 janecertfile.cer 中。也就是說,如果 jane 是某個密鑰項的別名,該命令將導出該密鑰倉庫項中所含證書鏈底部的證書。這是認證 jane 的公鑰用的證書。
相反,如果 jane 是某個可信任證書項的別名,則導出的是該可信任的證書。
顯示證書
要列印某個密鑰倉庫項的內容,請用 -list 命令,如下所示:
keytool -list -alias joe
如果未指定別名,如下所示:
keytool -list
則列印整個密鑰倉庫的內容。
要顯示儲存在檔案中的證書的內容,請用 -printcert 命令,如下所示:
keytool -printcert -file certfile.cer
這將列印儲存在檔案 certfile.cer 中的有關證書的信息。
注意:此操作與密鑰倉庫無關,也就是說,不需要密鑰倉庫即可顯示儲存在檔案中的證書。
生成自簽名證書
自簽名證書是一個這樣的證書:其簽發人(簽名人)與主體(證書所認證的公鑰所屬的實體)相同。當調用 -genkey 命令來生成新的公鑰/私鑰對時,它同時也把公鑰打包進自簽名證書中。
有時您也許希望生成新的自簽名證書。例如,您也許想對不同身份(特徵名)使用相同的密鑰對。例如,假設您換了個部門。此時您可以:
複製原始的密鑰項。請參見 -keyclone。
用新特徵名為該複製項生成新的自簽名證書。參見下文。
為該複製項生成證書籤名請求,並導入答覆證書或證書鏈。參見 -certreq 和 -import 命令。
刪除原始(現在已過時)項。參見 -delete 命令。
要生成自簽名證書,請用 -selfcert 命令,如下所示:
keytool -selfcert -alias dukeNew -keypass b92kqmp
-dname "cn=Duke Smith, ou=Purchasing, o=BlueSoft, c=US"
所生成的證書作為指定別名(本例中為“dukeNew”)所標識的密鑰倉庫項中的單元素證書來存儲,它將取代現有的證書鏈。
注意事項
下面列出各種命令及其選項,並對它們進行描述。
命令
另請參閱命令和選項注釋。
向密鑰倉庫添加數據
-genkey {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass]
產生密鑰對(公鑰和與之關聯的私鑰)。將公鑰打包進 X.509 v1 的自簽名證書中,該證書以單元素證書鏈的形式儲存。該證書鏈和私鑰將儲存於 alias 所標識的新密鑰倉庫項中。
keyalg 指定了用於生成密鑰對的算法,而 keysize 指定要生成的每個密鑰的大小。sigalg 指定簽名自簽名證書所用的算法;這一算法必須與 keyalg 兼容。參見支持的算法和密鑰大小。
dname 指定與 alias 關聯的 X.500 特徵名,並用作自簽名證書中的 issuer 和 subject 域。如果在命令行中沒有提供特徵名,用戶將得到要求輸入該信息的提示。
keypass 是口令,用來保護所生成密鑰對中的私鑰。如果沒有提供口令,用戶將得到要求輸入口令的提示。如果在提示符下按 RETURN 鍵,則密鑰口令將被設定為與密鑰倉庫所用的口令相同。keypass 的長度必須至少為 6 個字元。使用口令時必須小心 - 參見 與口令有關的警告。
valDays 指定證書的有效期。
-import {-alias alias} {-file cert_file} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass]
從檔案 cert_file 中讀取證書或證書鏈(後者在 PKCS#7 格式的答覆所給出)並將其儲存在 alias 所標識的密鑰倉庫項中。如果沒有給出檔案,則從標準輸入設備中讀取證書或 PKCS#7 答覆。keytool 可導入 X.509 v1、v2 和 v3 的證書以及由該類證書所組成的 PKCS#7 格式的證書鏈。要導入的數據必須是二進制編碼格式或 Internet RFC 1421 標準所定義的可列印的編碼格式(也稱 Base64 編碼)。在後一種情況下,編碼必須用以“-----BEGIN”開頭的字元串開始,用以“-----END”結尾的字元串來結束。
當導入新的可信任證書時,密鑰倉庫中還沒有 alias。在把證書添加到密鑰倉庫中之前,keytool 將嘗試用密鑰倉庫中已有的可信任證書來構造從該證書到自簽名證書(屬於根 CA)的信任鏈,以對證書進行校驗。
如果指定了 -trustcacerts 選項,則將為該信任鏈考慮其它證書,即考慮名為“cacerts”的檔案中的證書,該檔案位於 JDK 安全屬性目錄 java.home\lib\security 中,其中 java.home 為 JDK 安裝目錄。“cacerts”檔案代表含有 CA證書的系統範圍的密鑰倉庫。通過指定密鑰倉庫類型為“jks”,系統管理員可用 keytool 來配置和管理該檔案。“cacerts”密鑰倉庫檔案傳送時附有五個 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” 。系統管理員在安裝 JDK 後,就應該立即更改這個口令以及該檔案的預設訪問許可權。
如果 keytool 無法建立從要導入的證書到自簽名證書的信任路徑(利用密鑰倉庫或“cacerts”檔案),則列印出該證書的信息,而用戶將得到要求校驗的提示,例如,系統將通知用戶:通過比較顯示出的指紋和得自其它(可信任的)信息來源的指紋來進行校驗,而信息來源可能是證書擁有者本人。在將證書作為一個“可信任”證書導入之前,要十分小心,務必保證該證書是有效的! -- 參見有關導入可信任證書的警告。然後,用戶可以選擇中止導入操作。但是,如果給了 -noprompt 選項,則不會有與用戶的互動。
當導入認證答覆時,該認證答覆將用密鑰倉庫中可信任的證書來確認,有時也使用在“cacerts”密鑰倉庫檔案中配置的證書(如果指定了 -trustcacerts 選項)。
如果答覆是一個 X.509證書,keytool 將嘗試建立信任鏈,以該認證答覆為頭,以屬於根 CA 的自簽名證書為尾。該認證答覆和用於認證該認證答覆的證書層次形成了 alias 的新證書鏈。
如果答覆是 PKCS#7 格式的證書鏈,則該鏈應首先被排序(用戶證書在最前面,自簽名的根 CA 證書在最後面),然後 keytool 嘗試將答覆中的根 CA 證書與密鑰倉庫或“cacerts”密鑰倉庫檔案(如果指定了 -trustcacerts 選項)中的任何可信任證書進行匹配。如果找不到匹配,則列印出該根 CA證書的信息,而用戶將得到要求校驗它的提示,例如,系統將通知用戶通過比較顯示出的指紋和得自其它(可信任的)信息來源的指紋來進行校驗,信息來源可能是證書擁有者本人。因此,用戶可以選擇中止導入操作。但是,如果給了 -noprompt 選項,則不會有與用戶的互動。
alias 的新證書鏈將取代與該項關聯的舊證書鏈。只有提供了有效的 keypass,即提供了用於保護該項的私鑰的口令時,舊鏈才可被取代。如果沒有提供口令,而且私鑰口令與密鑰倉庫口令不同,用戶將得到要求輸入口令的提示。使用口令時必須小心 -- 參見與口令有關的警告。
-selfcert {-alias alias} {-sigalg sigalg} {-dname dname} {-validity valDays} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass]
利用密鑰倉庫信息(包括與 alias 關聯的私鑰和公鑰)產生 X.509 v1 自簽名證書。如果在命令行提供了 dname,它將同時用作該證書的簽發人和主體的 X.500 特徵名。否則,將使用與 alias 關聯的 X.500 特徵名(位於其現有證書鏈底部)。
所生成的證書作為 alias 所標識的密鑰倉庫項中的單元素證書鏈來存儲,它將取代現有的證書鏈。
sigalg 指定簽名證書用的算法。參見支持的算法和密鑰大小。
要訪問私鑰,必須提供正確的口令,因為私鑰在密鑰倉庫中是受口令保護的。如果在命令行中沒有提供 keypass,且私鑰口令與保護密鑰倉庫完整性所用的口令不同,則用戶將得到要求輸入該口令的提示。使用口令時必須小心 -- 參見與口令有關的警告。
注意事項
所有的命令和選項名之前都有減號 (-) 。
每個命令的選項都可按任意順序提供。
所有非斜體項或不在花括弧和方括弧內的項都不能改動。
選項周圍的花括弧通常表示如果在命令行中沒有指定該選項,則使用預設值。花括弧還用在 -v、-rfc 和 -J 選項周圍,這些選項只有在命令行中出現時才有意義(也就是說,它們沒有任何預設值,不然就是不存在該選項)。
選項周圍的方括弧表示如果在命令行中沒有指定該選項,則用戶將得到要求輸入其值的提示。(對於 -keypass 選項,如果在命令行中沒有指定該選項,keytool 將先是嘗試用密鑰倉庫口令來訪問私鑰,如果失敗,再提示您輸入私鑰口令。)
斜體項(選項)代表必須提供實際值。例如,下面是 -printcert 命令的格式:
keytool -printcert {-file cert_file}
當指定 -printcert 命令時,請用實際檔案名稱來替代 cert_file,如下所示:
keytool -printcert -file VScert.cer
如果選項值含有空白(空格),必須用引號把它們括起來。
-help 命令是預設命令。因此,命令行
keytool
等價於
keytool -help
選項預設值
下面是各選項的預設值。
-alias "mykey"
-keyalg "DSA"
-keysize 1024
-validity 90
-keystore 用戶宿主目錄中名為 .keystore 的檔案
-file 讀時為標準輸入,寫時為標準輸出
簽名算法(-sigalg 選項)是由所涉及私鑰的算法推導而來的:如果所涉及的私鑰是“DSA”類型,則 -sigalg 選項將預設為“帶 DSA 的 SHA1”,如果所涉及的私鑰是“RSA”類型,則 -sigalg 選項將預設為“帶 RSA 的 MD5”。
出現在大多數命令中的選項
-v 選項可出現在除 -help 之外的所有命令中。如果出現該選項,表示處在“長格式”模式下;將輸出詳細的證書信息。
-Jjavaoption 選項也可在任何命令中出現。如果出現該選項,則所指定的 javaoption 字元串將被直接傳給 Java 解釋器。(keytool 實際上是解釋器周圍的一個 “wrapper”。) 該選項不應含有任何空格。它有助於調整執行環境或記憶體使用。要獲得可用的解釋器選項的清單,可在命令行鍵入 java -h 或 java -X。
有三個選項可出現在用於操作密鑰倉庫的所有命令中:
-storetype storetype
此限定符指定將被實例化的密鑰倉庫類型。預設的密鑰倉庫類型是安全屬性檔案中“keystore.type”屬性值所指定的那個類型,由 java.security.KeyStore 中的靜態方法getDefaultType 返回。
-keystore keystore
密鑰倉庫(資料庫檔案)的位置。預設情況下,密鑰倉庫指的是用戶宿主目錄的 .keystore 檔案,它是由“user.home”的系統屬性確定的。在 Solaris 系統中,“user.home”預設為用戶宿主目錄。
-storepass storepass
口令,用來保護密鑰倉庫的完整性。
storepass 的長度必須至少為 6 個字元。所有訪問密鑰倉庫內容的命令都必須提供這一選項。對於這些命令,如果沒有給出 -storepass 選項,則用戶將得到要求輸入該選項的提示。
當從密鑰倉庫中檢索信息時,口令屬於可選項;如果未給出口令,就不能檢查所檢索信息的完整性,而且將出現警告。
使用口令時必須小心 - 參見與口令有關的警告。
與口令有關的警告
大多數對密鑰倉庫操作的命令都要求倉庫口令。一些命令要求私鑰口令。
口令可以在命令行上(分別在 -storepass 和 -keypass 選項上)指定。但是,除非是作為測試目的或是在一個安全的系統上,否則不應在命令行或腳本中指定口令。
如果沒有在命令行上指定所要求的口令選項,您將會得到要求輸入口令的提示。當在口令提示符下鍵入口令時,口令將被即時地顯示出來(鍵入什麼就顯示什麼),因此,要小心,不要當著任何人的面鍵口令。