Java
自帶的
keytool
工具
是個(gè)密鑰和證書管理工具。它使用戶能夠管理自己的公鑰
/
私鑰對(duì)及相關(guān)證書,用于(通過數(shù)字簽名)自我認(rèn)證(用戶向別的用戶
/
服務(wù)認(rèn)證自己)或數(shù)據(jù)完整性以及認(rèn)證服務(wù)。它還允許用戶儲(chǔ)存他們的通信對(duì)等者的公鑰(以證書形式)。
keytool
將密鑰和證書儲(chǔ)存在一個(gè)所謂的
密鑰倉(cāng)庫(kù)(
keystore
)
中。缺省的密鑰倉(cāng)庫(kù)實(shí)現(xiàn)將密鑰倉(cāng)庫(kù)實(shí)現(xiàn)為一個(gè)文件。它用口令來保護(hù)私鑰。
Java KeyStore
的類型
JKS
和
JCEKS
是
Java
密鑰庫(kù)
(KeyStore)
的兩種比較常見類型
(
我所知道的共有
5
種,
JKS, JCEKS, PKCS12, BKS
,
UBER)
。
JKS
的
Provider
是
SUN
,在每個(gè)版本的
JDK
中都有,
JCEKS
的
Provider
是
SUNJCE
,
1.4
后我們都能夠直接使用它。
JCEKS
在安全級(jí)別上要比
JKS
強(qiáng),使用的
Provider
是
JCEKS(
推薦
)
,尤其在保護(hù)
KeyStore
中的私鑰上(使用
TripleDes
)。
PKCS#12
是公鑰加密標(biāo)準(zhǔn),它規(guī)定了可包含所有私鑰、公鑰和證書。其以二進(jìn)制格式存儲(chǔ),也稱為
PFX
文件,在
windows
中可以直接導(dǎo)入到密鑰區(qū),注意,
PKCS#12
的密鑰庫(kù)保護(hù)密碼同時(shí)也用于保護(hù)
Key
。
BKS
來自
BouncyCastle Provider
,它使用的也是
TripleDES
來保護(hù)密鑰庫(kù)中的
Key
,它能夠防止證書庫(kù)被不小心修改(
Keystore
的
keyentry
改掉
1
個(gè)
bit
都會(huì)產(chǎn)生錯(cuò)誤),
BKS
能夠跟
JKS
互操作,讀者可以用
Keytool
去
TryTry
。
UBER
比較特別,當(dāng)密碼是通過命令行提供的時(shí)候,它只能跟
keytool
交互。整個(gè)
keystore
是通過
PBE/SHA1/Twofish
加密,因此
keystore
能夠防止被誤改、察看以及校驗(yàn)。以前,
Sun JDK(
提供者為
SUN)
允許你在不提供密碼的情況下直接加載一個(gè)
Keystore
,類似
cacerts
,
UBER
不允許這種情況。
?
證書導(dǎo)入
Der/Cer證書導(dǎo)入:
要從某個(gè)文件中導(dǎo)入某個(gè)證書,使用keytool工具的-import命令:
keytool -import -file mycert.der -keystore mykeystore.jks
如果在 -keystore選項(xiàng)中指定了一個(gè)并不存在的密鑰倉(cāng)庫(kù),則該密鑰倉(cāng)庫(kù)將被創(chuàng)建。
如果不指定 -keystore選項(xiàng),則缺省密鑰倉(cāng)庫(kù)將是宿主目錄中名為 .keystore的文件。如果該文件并不存在,則它將被創(chuàng)建。
創(chuàng)建密鑰倉(cāng)庫(kù)時(shí)會(huì)要求輸入訪問口令,以后需要使用此口令來訪問。可使用-list命令來查看密鑰倉(cāng)庫(kù)里的內(nèi)容:
keytool -list -rfc -keystore mykeystore.jks
P12格式證書導(dǎo)入:
keytool無(wú)法直接導(dǎo)入PKCS12文件。
第一種方法是使用IE將pfx證書導(dǎo)入,再導(dǎo)出為cert格式文件。使用上面介紹的方法將其導(dǎo)入到密鑰倉(cāng)庫(kù)中。這樣的話倉(cāng)庫(kù)里面只包含了證書信息,沒有私鑰內(nèi)容。
?
第二種方法是將pfx文件導(dǎo)入到IE瀏覽器中,再導(dǎo)出為pfx文件。
?????? 新生成的pfx不能被導(dǎo)入到keystore中,報(bào)錯(cuò):keytool錯(cuò)誤: java.lang.Exception: 所輸入的不是一個(gè) X.509 認(rèn)證。新生成的pfx文件可以被當(dāng)作keystore使用。但會(huì)報(bào)個(gè)錯(cuò)誤as unknown attr1.3.6.1.4.1.311.17.1,查了下資料,說IE導(dǎo)出的就會(huì)這樣,使用Netscape就不會(huì)有這個(gè)錯(cuò)誤.
第三種方法是將pfx文件當(dāng)作一個(gè)keystore使用。但是通過微軟的證書管理控制臺(tái)生成的pfx文件不能直接使用。keytool不認(rèn)此格式,報(bào)keytool錯(cuò)誤: java.io.IOException: failed to decrypt safe contents entry。需要通過OpenSSL轉(zhuǎn)換一下:
1)openssl pkcs12 -in mycerts.pfx -out mycerts.pem
2)openssl pkcs12 -export -in mycerts.pem -out mykeystore.p12
通過keytool的-list命令可檢查下密鑰倉(cāng)庫(kù)中的內(nèi)容:
keytool -rfc -list -keystore mykeystore.p12 -storetype pkcs12
這里需要指明倉(cāng)庫(kù)類型為pkcs12,因?yàn)槿笔〉念愋蜑?/span>jks。這樣此密鑰倉(cāng)庫(kù)就即包含證書信息也包含私鑰信息。
P7B格式證書導(dǎo)入:
keytool無(wú)法直接導(dǎo)入p7b文件。
需要將證書鏈RootServer.p7b(包含根證書)導(dǎo)出為根rootca.cer和子rootcaserver.cer 。
將這兩個(gè)證書導(dǎo)入到可信任的密鑰倉(cāng)庫(kù)中。
keytool -import -alias rootca -trustcacerts -file rootca.cer -keystore testkeytrust.jks
遇到是否信任該證書提示時(shí),輸入y
keytool -import -alias rootcaserver -trustcacerts -file rootcaserver.cer -keystore testkeytrust.jks
總結(jié):
1)P12格式的證書是不能使用keytool工具導(dǎo)入到keystore中的
2)The Sun's PKCS12 Keystore對(duì)從IE和其他的windows程序生成的pfx格式的證書支持不太好.
3)P7B證書鏈不能直接導(dǎo)入到keystore,需要將里面的證書導(dǎo)出成cer格式,再分別導(dǎo)入到keystore。
轉(zhuǎn)自http://blog.csdn.net/tearzhao/article/details/1761754