NOTE: (xp: %JAVA_HOME%/jre/lib/security/cacerts,  linux: $JAVA_HOME/jre/lib/security/cacerts)

驗(yàn)證是否已創(chuàng)建過(guò)同名的證書(shū)
keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -storepass changeit


刪除已創(chuàng)建的證書(shū)
keytool -delete -alias tomcat -keystore "%%JAVA_HOME%/jre/lib/security/cacerts " -storepass changeit

Keytool是一個(gè)Java數(shù)據(jù)證書(shū)的管理工具。
keystore

Keytool將密鑰(key)和證書(shū)(certificates)存在一個(gè)稱(chēng)為keystore的文件中
在keystore里,包含兩種數(shù)據(jù): 密鑰實(shí)體(Key entity)——密鑰(secret key)又或者是私鑰和配對(duì)公鑰(采用非對(duì)稱(chēng)加密)
                                               可信任的證書(shū)實(shí)體(trusted certificate entries)——只包含公鑰

Alias(別名)
每個(gè)keystore都關(guān)聯(lián)這一個(gè)獨(dú)一無(wú)二的alias,這個(gè)alias通常不區(qū)分大小寫(xiě)

keystore的存儲(chǔ)位置
在沒(méi)有制定生成位置的情況下,keystore會(huì)存在與用戶(hù)的系統(tǒng)默認(rèn)目錄,
如:對(duì)于window xp系統(tǒng),會(huì)生成在系統(tǒng)的C:\Documents and Settings\UserName\
文件名為“.keystore”

keystore的生成

引用

keytool -genkey -alias tomcat -keyalg RSA   -keystore d:\mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass -validity 180

參數(shù)說(shuō)明:
-genkey表示要?jiǎng)?chuàng)建一個(gè)新的密鑰
-dname表示密鑰的Distinguished Names,
CN=commonName
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C=country
Distinguished Names表明了密鑰的發(fā)行者身份
-keyalg使用加密的算法,這里是RSA
-alias密鑰的別名
-keypass私有密鑰的密碼,這里設(shè)置為changeit
-keystore 密鑰保存在D:盤(pán)目錄下的mykeystore文件中
-storepass 存取密碼,這里設(shè)置為changeit,這個(gè)密碼提供系統(tǒng)從mykeystore文件中將信息取出
-validity該密鑰的有效期為 180天 (默認(rèn)為90天)

cacerts證書(shū)文件(The cacerts Certificates File)
該證書(shū)文件存在于java.home\jre\lib\security目錄下,是Java系統(tǒng)的CA證書(shū)倉(cāng)庫(kù)

創(chuàng)建證書(shū)
1.服務(wù)器中生成證書(shū):(注:生成證書(shū)時(shí),CN要和服務(wù)器的域名相同,如果在本地測(cè)試,則使用localhost)
keytool -genkey -alias tomcat -keyalg RSA -keystore d:\mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass changeit
2.導(dǎo)出證書(shū),由客戶(hù)端安裝:
keytool -export -alias tomcat -keystore d:\mykeystore -file d:\mycerts.cer -storepass changeit
3.客戶(hù)端配置:為客戶(hù)端的JVM導(dǎo)入密鑰(將服務(wù)器下發(fā)的證書(shū)導(dǎo)入到JVM中)
keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -file d:\mycerts.cer -storepass changeit
生成的證書(shū)可以交付客戶(hù)端用戶(hù)使用,用以進(jìn)行SSL通訊,或者伴隨電子簽名的jar包進(jìn)行發(fā)布者的身份認(rèn)證。

常出現(xiàn)的異常:“未找到可信任的證書(shū)”--主要原因?yàn)樵诳蛻?hù)端未將服務(wù)器下發(fā)的證書(shū)導(dǎo)入到JVM中,可以用
keytool -list -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass changeit

linux: #keytool -list -alias tomcat -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit
來(lái)查看證書(shū)是否真的導(dǎo)入到JVM中。

keytool生成根證書(shū)時(shí)出現(xiàn)如下錯(cuò)誤:

keytool錯(cuò)誤:java.io.IOException:keystore was tampered with,or password was incorrect

原因是在你的home目錄下是否還有.keystore存在。如果存在那么把他刪除掉,然后再執(zhí)行

或者刪除"%JAVA_HOME%/jre/lib/security/cacerts 再執(zhí)行


keytool 用法:

-certreq     [-v] [-protected]

             [-alias <別名>] [-sigalg <sigalg>]

             [-file <csr_file>] [-keypass <密鑰庫(kù)口令>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-changealias [-v] [-protected] -alias <別名> -destalias <目標(biāo)別名>

             [-keypass <密鑰庫(kù)口令>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-delete      [-v] [-protected] -alias <別名>

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-exportcert  [-v] [-rfc] [-protected]

             [-alias <別名>] [-file <認(rèn)證文件>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-genkeypair  [-v] [-protected]

             [-alias <別名>]

             [-keyalg <keyalg>] [-keysize <密鑰大小>]

             [-sigalg <sigalg>] [-dname <dname>]

             [-validity <valDays>] [-keypass <密鑰庫(kù)口令>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-genseckey   [-v] [-protected]

             [-alias <別名>] [-keypass <密鑰庫(kù)口令>]

             [-keyalg <keyalg>] [-keysize <密鑰大小>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-importcert  [-v] [-noprompt] [-trustcacerts] [-protected]

             [-alias <別名>]

             [-file <認(rèn)證文件>] [-keypass <密鑰庫(kù)口令>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-importkeystore [-v]

             [-srckeystore <源密鑰庫(kù)>] [-destkeystore <目標(biāo)密鑰庫(kù)>]

             [-srcstoretype <源存儲(chǔ)類(lèi)型>] [-deststoretype <目標(biāo)存儲(chǔ)類(lèi)型>]

             [-srcstorepass <源存儲(chǔ)庫(kù)口令>] [-deststorepass <目標(biāo)存儲(chǔ)庫(kù)口令>]

             [-srcprotected] [-destprotected]

             [-srcprovidername <源提供方名稱(chēng)>]

             [-destprovidername <目標(biāo)提供方名稱(chēng)>]

             [-srcalias <源別名> [-destalias <目標(biāo)別名>]

               [-srckeypass <源密鑰庫(kù)口令>] [-destkeypass <目標(biāo)密鑰庫(kù)口令>]]

             [-noprompt]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-keypasswd   [-v] [-alias <別名>]

             [-keypass <舊密鑰庫(kù)口令>] [-new <新密鑰庫(kù)口令>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-list        [-v | -rfc] [-protected]

             [-alias <別名>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]


-printcert   [-v] [-file <認(rèn)證文件>]


-storepasswd [-v] [-new <新存儲(chǔ)庫(kù)口令>]

             [-keystore <密鑰庫(kù)>] [-storepass <存儲(chǔ)庫(kù)口令>]

             [-storetype <存儲(chǔ)類(lèi)型>] [-providername <名稱(chēng)>]

             [-providerclass <提供方類(lèi)名稱(chēng)> [-providerarg <參數(shù)>]] ...

             [-providerpath <路徑列表>]