★ 實例說明
本實例使用JSDK提供的keytool工具用默認的密鑰庫和算法創建幾個數字證書
★運行程序
keytool程序運行時加上命令行參數–genkey即可
在命令行中輸入keytool –genkey將自動使用默認的算法生成公鑰和私鑰並以交互方式獲得公鑰持有者的信息其交互過程如下其中帶下劃線的字符為用戶鍵盤輸入的內容其他為系統提示的內容
C:\>keytool genkey
輸入keystore密碼
您的名字與姓氏是什麼?
[Unknown] Liao Weimin
您的組織單位名稱是什麼?
[Unknown] Network Center
您的組織名稱是什麼?
[Unknown] Guangzhou University
您所在的城市或區域名稱是什麼?
[Unknown] ZB
您所在的州或省份名稱是什麼?
[Unknown] Guangzhou
該單位的兩字母國家代碼是什麼
[Unknown] CN
CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN 正確嗎?
[否] 是
輸入的主密碼
(如果和 keystore 密碼相同按回車) abcdefg
C:\>
以上操作將生成一個公鑰和一個私鑰這裡並未指定使用何算法將使用默認的DSA算法
同時上述操作將創建一個數字證書證書中包含了新生成的公鑰和一個名字為CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN的主體(人或機構)的對應關系其中CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN是X格式的全名包含了主體的國家州城市機構單位和名字這樣這個證書將證明相應的公鑰是這個人或機構所擁有的
以上生成的公鑰私鑰和證書都保存在用戶的主目錄中創建一個默認的文件keystore中如果是Windows 系統用戶主目錄是c:\ Documents and Setting\用戶名
由於keystore中包含了私鑰所以是一個需要保密的文件因此上述操作提示為該文件設置一個密碼輸入keystore密碼這裡因為是第一次使用該密鑰庫因此輸入的密碼將成為該默認的密鑰庫的密碼(實際使用時應該設置復雜的口令)以後再使用這個密鑰庫時必須提供這個口令才可以使用
以上操作最後還提示輸入的主密碼這裡mykey是默認的別名使用該名字可以在密鑰庫keystore中找到對應的公鑰私鑰和證書此處輸入的密碼是對應於該別名的私鑰的密碼密鑰庫中每個別名可以使用不同的密碼加以保護
使用別名
密鑰庫中可以存放多個條目(公鑰/私鑰對和證書)它們在密鑰庫中以別名(alias)區分小節在使用keytool工具時沒有指定別名因此系統使用了默認的別名mykey如果再次運行keytool –genkey則系統將提示keytool錯誤 javalangException: 沒有創建鍵值對別名 已經存在因此當密鑰庫中有多個公鑰/私鑰對和證書時應該使用別名
★ 實例說明
本實例使用JSDK提供的keytool工具用在默認的密鑰庫中利用別名增加多個證書
★運行程序
keytool程序運行時加上命令行參數–alias即可
在命令行中輸入keytool –genkey –alias liaoweimin將自動使用默認的算法生成別名為liaoweimin的公鑰和私鑰並以交互方式獲得公鑰持有者的信息其交互過程如下
C:\>keytool genkey alias liaoweimin
輸入keystore密碼
您的名字與姓氏是什麼?
[Unknown] Liao Weimin
您的組織單位名稱是什麼?
[Unknown] Network Center
您的組織名稱是什麼?
[Unknown] SHU
您所在的城市或區域名稱是什麼?
[Unknown] ZB
您所在的州或省份名稱是什麼?
[Unknown] SH
該單位的兩字母國家代碼是什麼
[Unknown] CN
CN=Liao Weimin OU=Network Center O=SHU L=ZB ST=SH C=CN 正確嗎?
[否] 是
輸入的主密碼
(如果和 keystore 密碼相同按回車)
其中輸入keystore密碼後面輸入的內容必須和小節相同的密碼否則將無法訪問密鑰庫並提示如下錯誤keytool錯誤 javaioIOException: Keystore was tampered with or password was incorrect這是因為小節已經為默認的密鑰庫設置了該密碼以後使用該密鑰庫都必須提供該密碼
在輸入 的主密碼的提示後這裡不妨直接按回車鍵這樣該私鑰將使用和密鑰庫相同的密碼來保護
以上操作將在用戶主目錄的keystore文件中增加一對公鑰和私鑰(DSA算法)同時增加一個數字證書證書中包含了新生成的公鑰和一個名字為CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN的主體(人或機構)的對應關系
使用指定的算法和密鑰庫和有效期
和小節中使用的是默認的算法和密鑰庫本節介紹如何自己指定算法和密鑰庫
★ 實例說明
本實例使用JSDK提供的keytool工具用RSA算法和在指定的密鑰庫mykeystore中創建公鑰/私鑰對和證書
★運行程序
keytool的keyalg參數可以指定密鑰的算法如果需要指定密鑰的長度可以再加上keysize參數密鑰長度默認為位使用DSA算法時密鑰長度必須在到之間並且是的整數倍
Keytool的keystore參數可以指定密鑰庫的名稱密鑰庫其實是存放密鑰和證書的文件密鑰庫對應的文件如果不存在自動創建
validity參數可以指定所創建的證書有效期是多少天
如在命令行中輸入keytool genkey alias mytest keyalg RSA keysize keystore mykeystore validity 將使用RSA算法生成位的公鑰/私鑰對及整數密鑰長度為位證書有效期為天使用的密鑰庫為mykeystore文件
C:\java\ch>keytool genkey alias mytest keyalg RSA keysize keystore mykeystore validity
輸入keystore密碼 wshrut
您的名字與姓氏是什麼?
[Unknown] Liao Weimin
您的組織單位名稱是什麼?
[Unknown] Network Center
您的組織名稱是什麼?
[Unknown] Guangzhou University
您所在的城市或區域名稱是什麼?
[Unknown] ZB
您所在的州或省份名稱是什麼?
[Unknown] Guangzhou
該單位的兩字母國家代碼是什麼
[Unknown] CN
CN=Liao Weimin OU=Network Center O=Guangzhou University L=ZB ST=Guangzhou C=CN 正確嗎?
[否] 是
輸入的主密碼
(如果和 keystore 密碼相同按回車)
C:\java\ch>
由於當前目錄下沒有mykeystore文件因此以上操作將在當前目錄建立文件名為mykeystore的文件並提示輸入一個密碼加以保護輸入keystore密碼因為這裡使用的密鑰庫和小節及小節不是同一個文件因此這裡輸入的密碼和小節及小節沒有必要一致這裡不妨設置為wshrut這樣以後再使用這個密鑰庫文件時必須提供該密碼
對其中的輸入的主密碼這裡不妨直接按回車鍵這樣mykeysotre文件中的mytest條目將使用和密鑰庫相同的密碼wshrut
使用Keytool將數字證書導出到文件
★ 實例說明
本實例使用JSDK提供的keytool工具將指定的證書從密鑰庫導出為編碼過和沒編碼過兩種格式的文件
★運行程序
使用keytool的export參數可以將別名指定的證書導出到文件文件名通過file參數指定如輸入如下命令
C:\java\ch>keytool export alias liaoweimin file liaoweimincer
輸入keystore密碼
保存在文件中的認證
則將默認密鑰庫中的liaoweimin條目對應的證書導出到文件liaoweimincer中由於命令行中沒有用storepass給出密碼因此屏幕提示輸入keystore密碼由於證書中不包含私鑰因此不需要條目的主密碼
該操作完成後將在當前目錄中創建liaoweimincer文件該文件即是默認密鑰庫中的liaoweimin條目對應的證書它包含了公鑰和主體的對應關系內容也可以公開
輸入如下命令則可以指定密鑰庫
C:\java\ch>keytool export alias lf file lfcer keystore lfkeystore –storepass wshrut
保存在文件中的認證
該操作完成後將在當前目錄中創建lfcer文件
如果用文本編輯器打開liaoweimincer或lfcer將會發現它是二進制文件有些內容無法顯示這不利於公布證書在導出證書時加上rfc參數則可以使用一種可打印的編碼格式來保存證書如
C:\java\ch> keytool export alias mytest file mytestcer keystore mykeystore storepass wshrut rfc
保存在文件中的認證
則當前目錄下將增加一個文件mytestcer其內容是編碼過的可以在屏幕上顯示拷貝或打印如圖所示(打印內容不同)
使用Keytool從文件中顯示證書
★ 實例說明
本實例使用JSDK提供的keytool工具將小節導出的證書文件顯示出來
★運行程序
使用keytool的printcert參數可以將小節導出到證書文件詳細內容顯示出來文件名稱通過file參數指定如
C:\java\ch>keytool printcert file lfcer
(見自己的屏幕)
對編碼過的證書可以同樣顯示如
C:\java\ch>keytool printcert file mytestcer
(見自己的屏幕)
在Windows中從文件顯示證書
★ 實例說明
本實例在Windows中直接顯示小節導出的證書文件
★運行程序
小節導出的證書文件中只要文件名以cer為後綴Windows操作系統就可以直接識別如在Windows中雙擊lfcer圖標將出現窗口其中包含了證書的所有者頒發者有效期等信息這些信息和使用keytool顯示出的信息一致
由於該證書是用自己的私鑰對該證書進行數字簽名的即自己給自己簽發的證書因此窗口中顯示警告信息該證書發行機構根證書沒受信任
假設您用 jarsigner 工具來簽名 Java 歸檔 (JAR) 文件需要使用這一文件的客戶機將認證您的簽名
認證簽名的一種方法是先將您的公鑰證書作為可信任項導入它們的密鑰倉庫中您可以將證書導出並將其提供給客戶機例如假設項的別名為mykey您可以用以下命令將您的證書導出到名為 MJcer 的文件中
keytool export alias mykey file MJcer
有了該證書以及已被簽名的 JAR 文件客戶機就可以用 jarsigner 工具來認證您的簽名
更改特征名但保留密鑰對
假設譬如說因為您換了部門或搬到另一個城市去了而改變了您的特征名如果願意您仍然可以使用您先前使用的公鑰/私鑰對而只對特征名進行更新例如假設您的名字叫 Susan Miller並用別名 sMiller 和以下的特征名創建了初始密鑰項
cn=Susan Miller ou=Finance Department o=BlueSoft c=us
假設您從財務部門換到了會計部門您仍然可使用先前所生成的公鑰/私鑰對而用以下方法對特征名進行更新首先復制您的密鑰項
keytool keyclone alias sMiller dest sMillerNew
(您將得到要求輸入密鑰倉庫口令和初始密鑰口令及目標密鑰口令的提示因為在命令行沒有提供這些信息)現在您需要更改與復制項關聯的證書鏈以使鏈中的第一個證書使用您的新特征名先用相應名稱生成自簽名證書
keytool selfcert alias sMillerNew
dname cn=Susan Miller ou=Accounting Department o=BlueSoft c=us
然後根據該新證書中的信息生成證書簽名請求
keytool certreq alias sMillerNew
當您得到 CA 認證答復後將其導入
keytool import alias sMillerNew file VSSMillerNewcer
導入認證答復後您也許會要刪除使用舊特征名的初始密鑰項
keytool delete alias sMiller
將認證後的CA根證書導入密鑰庫以便於用這個公鑰證書來進行認證簽名其它的證書
keytool import trustcacerts alias zhky keystore tujks file xtlcer
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27201.html