一茎辐、keytool 密鑰和證書管理工具
Keytool將密鑰(key)和證書(certificates)存在一個稱為keystore的文件中如绸。
在keystore里藏鹊,包含兩種數(shù)據(jù):?密鑰實體(Key entity)——密鑰(secret key)又或者是私鑰和配對公鑰(采用非對稱加密)
可信任的證書實體(trusted certificate entries)——只包含公鑰
Alias(別名)轨帜,每個keystore都關(guān)聯(lián)這一個獨一無二的alias皮假,這個alias通常不區(qū)分大小寫
它使用戶能夠管理自己的
公鑰/私鑰對及相關(guān)證書鞋拟,用于(通過數(shù)字簽名)自我認(rèn)證(用戶向別的用戶/服務(wù)認(rèn)證自己)或數(shù)據(jù)完整性以及認(rèn)證服務(wù)。它還允許用戶儲存他們的通信對等者的公鑰(以證書形式)惹资。
我的理解就是:
當(dāng)外面系統(tǒng)要訪問我們的系統(tǒng)的時候贺纲,就需要給出雙方彼此信任的證書,證書里面就包含了外部系統(tǒng)的個人信息,例如:公司名稱褪测、公司地址猴誊、密碼等。
Keytool把鑰匙和證書儲存到一個keystore侮措,默任實現(xiàn)keystore的是一個文件稠肘,它用一個密碼保護鑰匙.。只有這些信息對應(yīng)上了萝毛,我們的系統(tǒng)才可放行项阴,讓外部系統(tǒng)進入到我們的系統(tǒng)內(nèi),并進行相關(guān)的業(yè)務(wù)操作笆包。
數(shù)字證書
所有的數(shù)字證書是以一條一條(采用別名區(qū)別)的形式存入證書庫的中环揽,證書庫中的一條證書包含該條證書的私鑰,公鑰和對應(yīng)的數(shù)字證書的信息庵佣。
證書庫中的一條證書可以導(dǎo)出數(shù)字證書文件歉胶,數(shù)字證書文件只包括主體信息和對應(yīng)的公鑰。
證書概念
一個證書是一個實體的數(shù)字簽名,還包含這個實體的公共鑰匙值.???
1) 公共鑰匙?:是一個詳細(xì)的實體的數(shù)字關(guān)聯(lián),并有意讓所有想同這個實體發(fā)生信任關(guān)系的其他實體知道.公共鑰匙用來檢驗簽名;????????
2) 數(shù)字簽名:是實體信息用實體的私有鑰匙簽名(加密)后的數(shù)據(jù).這條數(shù)據(jù)可以用這個實體的公共鑰匙來檢驗簽名(解密)出實體信息以鑒別實體的身份;??????????????
3) 簽名:用實體私有鑰匙加密某些消息巴粪,從而得到加密數(shù)據(jù);??????
4) 私有鑰匙:是一些數(shù)字,私有和公共鑰匙存在所有用公共鑰匙加密的系統(tǒng)的鑰匙對中通今。
公共鑰匙用來加密數(shù)據(jù),私有鑰匙用來計算簽名.
公鑰加密的消息只能用私鑰解密肛根,私鑰簽名的消息只能用公鑰檢驗簽名辫塌。????????
5) 實體:一個實體可以是一個人,一個組織,一個程序,一臺計算機,一個商業(yè),一個銀行,或其他你想信任的東西.?
keytool是一個工具可以用來創(chuàng)建包含公鑰和密鑰的的keystore文件,并且利用keystore文件來創(chuàng)建只包含公鑰的truststore文件派哲。
二臼氨、生成一個keystone
# keytool? \
-genkeypair \
-keystore?keystone.jks? \
-alias? certificatekey??\
-keypass?123456?\
-storepass?123456?\
-keyalg RSA \
-keysize 2048 \
-validity 5000 \
-dname "CN=*.example.com,OU=Test,O=Test,L=ShenZhen,ST=GuangDong,C=CN" \
-ext "SAN=DNS:www.example.com,IP:192.168.1.105" ?\
-ext "BC=ca:true"
查看keystone
# keytool -list -v -keystore keystone.jks -storepass "123456"
默認(rèn),-list?命令打印證書的?MD5?指紋芭届。
如果指定了?-v?選項储矩,將以可讀格式打印證書感耙,如果指定了?-rfc?選項,將以可打印的編碼格式輸出證書持隧。
# keytool -list ?-rfc -keystore ?keystone.jks ?-storepass "123456"
證書的導(dǎo)出
# ?keytool ?-export -alias certificatekey ?-keystore keystone.jks ?-file ?selfsignedcert.crt? --storepass "123456"
查看導(dǎo)出的證書信息?
# keytool -printcert -file selfsignedcert.crt
# keytool -printcert -file selfsignedcert.crt -rfc
三即硼、證書導(dǎo)入
生成一個用于導(dǎo)入的證書
# keytool-genkeypair \
-alias? nginx \
-keypass 123456 \
-keyalg RSA \
-keysize 1024 \
-validity 365 \
-keystore ?nginx.jks? \
-storepass 123456 \
-dname "CN=Test,OU=Test, O=Test, L=Test,ST=Test,C=CN"
導(dǎo)出 別名為nginx的nginx.jks條目
#?keytool? -keystore nginx.jks? ?-storepass "123456" -export -alias nginx? -file? nginx.crt
將nginx.crt 加入到keestone.jks
#?keytool? -import -alias?nginx ?\
-file nginx.crt ?\
-keypass 123456 \
-keystore keystone.jks ?\
-storepass "123456"
# ?keytool -list ?-v -keystore keystone.jks ?-storepass ?"123456"
密鑰庫類型: JKS
密鑰庫提供方: SUN
您的密鑰庫包含 2 個條目
三、證書條目的刪除和密碼修改
證書條目的刪除
# ?keytool?-delete? -alias? ?certificatekey ?-keystore keystone.jks ? -storepass 123456
證書條目口令的修改
# keytool?-keypasswd ?-alias? nginx? \
?-keypass?123456(原始密碼)? \
-new?654321(別名的新密碼)? \
-keystore ?keystone.jks \
?-storepass 123456
keystore口令的修改
# keytool??-storepasswd? -keystore?keystone.jks(需修改口令的keystore)? -storepass?123456(原始密碼)? -new?1008610(新密碼)
修改keystore中條目的信息
# keytool?-selfcert? ?-alias? nginx?\
-keypass 123456?\
-keystore nginx.jks? \
-storepass 123456 \
-dname "CN=*.example.com,OU=test,O=test,L=ShenZhen,ST=GuangDong,C=CN"
只能修改原來的 nginx.jks中的 nginx條目屡拨,無法修改導(dǎo)入到 keystone.jks中的nginx條目只酥!
以上就是keytool的相關(guān)概念和基本用法了。現(xiàn)在我們應(yīng)該明白了證書里面是包含什么東西了洁仗,無非就是對商家的信息進行加密层皱,然后憑借著加密過的證書來互相之間的識別性锭。
在我們的系統(tǒng)中赠潦,我們一般會把證書放到接口所在的服務(wù)器,因為我們的系統(tǒng)是分布式架構(gòu)草冈,所以可能對于不同的業(yè)務(wù)會部署在不同的服務(wù)器上她奥。
正常情況下,證書的認(rèn)證就是需要接口的相關(guān)方法來識別的怎棱,所以我們就是將證書存放在了與接口所部署的服務(wù)器上哩俭,這樣,只要有第三方訪問我們的系統(tǒng)拳恋,我們就可以先驗證他們的證書凡资,只有證書正確了我們才可放行,這也是為了安全而考慮的谬运。
四隙赁、參考
Generating a Java keystore and key pair using the keytool command
?How to use keytool and openssl
https://www.zybuluo.com/torresdyl/note/520486
Java keytool的要領(lǐng):使用Java密鑰庫工作
https://www.howtoing.com/java-keytool-essentials-working-with-java-keystores
Java Keytool Essentials: Working with Java Keystores
https://www.digitalocean.com/community/tutorials/java-keytool-essentials-working-with-java-keystores