JAVA SECURITY 中的 KEYTOOL
歐政儒
0. 概要
Java中的keytool是種秘鑰與證書的管理工具 可用來管理由私鑰和認証相關公鑰的 X.509 証書鏈組成的密鑰倉庫(資料庫)。還管理來自可信任實體的証書。
1.簡介
1.1介紹
keytool 是個密鑰和証書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關証書,用於(通過數字簽名)自我認証(用戶向別的用戶/服務認証自己)或數據完整性以及認証服務。它還允許用戶儲存他們的通信對等者的公鑰(以証書形式)。
“證書”是來自一個實體(個人、公司等)的經數字簽名的聲明,它聲明某些其它實體的公鑰(及其它資訊)具有某一的特定值。當數據被數字化簽名後,校驗簽名即可檢查數據的完整性和真實性。完整性的意思是數據沒有被修改或損壞過,真實性的意思是數據的確是來自聲稱創建了該數據和對它進行簽名的實體。
keytool 將密鑰和証書儲存在一個所謂的密鑰倉庫中。預設的”密鑰倉庫實現”將密鑰倉庫實現為一個文件。它用密碼來保護私鑰。
1.2 由來
目前internet的使用,以browser為佔大多數,如果希望browser能達到一般網路應用軟體應有的功能,java applet似乎是不可能,若以MS的ActiveX來當做solution的話,除了必需被Microsoft綁住之外,安全也是一大隱優,所以目前的解決之道除了對browser下功夫之外,就屬signed applet為目前最佳的解決方法,因為signed applet 可在程度上適當的不受browser限制,又可經過安全認證的保護,以確保資料安全與完整。
因此開發Java的sun公司提出了一個關於簽署安全證書的相關工具”keytool”
1.3 使用動機
目前大多數browser都支援的java applet,可跨平台是其最大的優點,但是在security上會被browser所限制,其強制採用的主要安全限制:
Applet不能在執行的機器上進行一般的讀寫動作:
雖然在JDK所提供的Applet Viewer允許使用者去定義檔案的存取規則,但是在一般的browser上如 Netscape,MS IE等是不允許的,以免使用者的電腦資料被破壞或竊取。
2.系統架構
2.1 主要指令架構
-genkey {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-import {-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-selfcert {-alias alias} {-sigalg sigalg} {-dname dname} {-validity valDays} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-identitydb {-file idb_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-certreq {-alias alias} {-sigalg sigalg} {-file certreq_file} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-export {-alias alias} {-file cert_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-rfc} {-v} {-Jjavaoption}
-list {-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v | -rfc} {-Jjavaoption}
-printcert {-file cert_file} {-v} {-Jjavaoption}
-keyclone {-alias alias} [-dest dest_alias] [-keypass keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-storepasswd [-new new_storepass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-keypasswd {-alias alias} [-keypass old_keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-delete [-alias alias] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
-help
2.2 採用的一些加密演算法
DSA
SHA1withDSA
RSA
MD5withRSA
以上皆是產生私鑰和公開鑰的演算法
2.3採用的一些Certificate Standard Format
X.500
X.509
RFC 1421
這些標準大約規定了証書可以包含什麼資訊,並說明了記錄資訊的方法(數據格式)。除了簽名外,所有類似的証書還包含以下數據:
版本 序列號 簽名算法標識符 簽發人姓名 有效期 主體名 主體公鑰資訊
3.操作範例
假設您要創建一個密鑰倉庫以管理您的公鑰/私鑰對和來自您所信任實體的証書。
3.1 產生密鑰對
您首先要做的是創建一個密鑰倉庫和產生密鑰對。您可以使用以下命令:
keytool -genkey -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" -alias business -keypass kpi135 -keystore C:\working\mykeystore-storepass ab987c -validity 180
(請注意:鍵入該命令時必須使其成為一行。此處用多行來顯示,主要是為了可讀性。)
該命令將在 C 槽的“working”目錄(假設它還不存在)中創建名為“mykeystore”的密鑰倉庫,並賦予它密碼“ab987c”。它將為實體產生公鑰/私鑰對,該實體的“特徵名”為:常用名“Mark Jones”、組織單位“JavaSoft”、組織“Sun”和兩個字母的國家程式碼“US”。它使用預設的“DSA”密鑰產生算法來創建密鑰,兩個密鑰(公鑰與私鑰)的長度都是 1024 位。
它創建自簽名証書(使用預設的“帶 DSA 的 SHA1”簽名算法),該証書包括公鑰和特徵名資訊。該証書的有效期為 180 天,且與別名“business”所代表的密鑰倉庫項關聯。私鑰被賦予密碼“kpi135”。
如果採用選項的預設值,可以大大縮短該命令。實際上,這些選項並不是必需的﹔對於有預設值的選項,未指定時將使用預設值,對於任何被要求的值,您將會得到要求輸入它的提示。
3.2從認證機構請求已簽名的證書
目前為止我們所具有的就是自簽名証書。証書如果由認証機構 (CA) 簽名,將更有可能得到別人的信任。要得到這樣的簽名,首先要用以下命令產生証書簽名請求 (CSR):
keytool -certreq -file MarkJ.csr
這將為預設別名“mykey”所標識的實體產生 CSR,並將此請求放在名為“MarkJ.csr”的文件中。將此文件提交給某個 CA(例如 VeriSign, Inc.)。該 CA 將對您這個請求者進行認証(通常是離線的),然後返回它們所簽名的証書,用於認証您的公鑰。(某些情況下,它們實際上將返回証書鏈,鏈中每個証書都認証前一個証書的簽名人的公鑰。)
3.3 導入CA的證書
來自 CA 的証書通常是自簽名的或是由另一個 CA 簽名的(這種情況下您還需要認証該 CA 的公鑰的証書)。假設 ABC, Inc. 公司是 CA,而您從該公司獲得一個聲稱是自簽名証書的名為“ABCCA.cer”的文件,它用於認証該 CA 的公鑰。
如果您相信証書是有效的,就可以用以下命令將其加到密鑰倉庫中:
keytool -import -alias abc -file ABCCA.cer
這將在密鑰倉庫中把文件“ABCCA.cer”中的數據創建成“可信任証書”項
3.4 導入來自CA的認證答覆
一旦導入了用於認証 CA(該 CA 是您將証書簽名請求送往之處)公鑰的証書後,或在“cacerts”文件中已有這種証書時,就可以導入該認証答復,從而用証書鏈取代您的自簽名証書。如果 CA 的答復是証書鏈,則該鏈是 CA 響應您的請求而返回的証書鏈﹔如果 CA 的答復是一個証書,則該鏈是用認証答復和可信任証書建立的証書鏈,這些可信任証書是密鑰倉庫(您要將認証答復導入之處)或“cacerts”密鑰倉庫文件中已有的。
例如,假設您將証書簽名請求送往 VeriSign。您可用以下命令來導入認証答復,該命令假定所返回的証書名為“VSMarkJ.cer”:
keytool -import -trustcacerts -file VSMarkJ.cer
3.5 導出用於認證您的公鑰的證書
假設您用 jarsigner 工具來簽名 Java 檔案庫 (JAR) 文件。需要使用這一文件的客戶端將認証您的簽名。
認証簽名的一種方法是先將您的公鑰証書作為“可信任”項導入它們的密鑰倉庫中。您可以將証書導出並將其提供給客戶端。例如,假設項的別名為“mykey”,您可以用以下命令將您的証書導出到名為 MJ.cer 的文件中:
keytool -export -alias mykey -file MJ.cer
有了該証書以及已簽名的 JAR 文件,客戶端就可以用 jarsigner 工具來認証您的簽名。
4. 參考來源
“Java Security” 第二版 Scott Oaks 著 (O’RELLY)
“Java Cryptography” Jonathan Knudsen 著 (O’RELLY)
“Learning Java” Patrick Niemeyer & Jonathan Knudsen 著 (O’RELLY)
http://java.sun.com/products/jdk/1.2/docs/tooldocs/solaris/keytool.html
http://java.sun.com/products/jdk/1.2/docs/tooldocs/solaris/jarsigner.html
http://java.sun.com/docs/books/tutorial/security1.2/index.html
posted on 2005-10-20 13:51
夜来风雨声 阅读(822)
评论(0) 编辑 收藏 所属分类:
Java