生成伺服器端金鑰
keytool -genkey -alias serverkey -keystore kserver.keystore
匯出伺服器端證書
keytool -export -alias serverkey -keystore kserver.keystore -file server.crt
將伺服器端證書儲存到客戶端受信金鑰中
keytool -import -alias serverkey -file server.crt -keystore tclient.keystore
採用同樣的方法,生成客戶端的私鑰,客戶端的證書,並且匯入到服務端的trust keystore中
1)keytool -genkey -alias clientkey -keystore kclient.keystore
2)keytool -export -alias clientkey -keystore kclient.keystore -file client.crt
3)keytool -import -alias clientkey -file client.crt -keystore tserver.keystore
如此一來,生成的檔案分成兩組
服務端儲存:kserver.keystore tserver.keystore
客戶端儲存:kclient.keystore tclient.keyestore
根據需要可以使用雙向或單向認證,這裡給出單向認證
伺服器端:
sslcontext context = sslcontext.getinstance("tls");keymanage***ctory keyfactory = keymanage***ctory.getinstance(keymanage***ctory.getdefaultalgorithm());
trustmanage***ctory trustfactory = trustmanage***ctory.getinstance(trustmanage***ctory.getdefaultalgorithm());
keystore ks = keystore.getinstance("jks");
keystore tks = keystore.getinstance("jks");
ks.load(new fileinputstream("kserver.keystore"), "密碼".tochararray());
tks.load(new fileinputstream("tserver.keystore"), "密碼".tochararray());
keyfactory.init(ks, "密碼".tochararray());
trustfactory.init(tks);
context.init(keyfactory.getkeymanagers(), trustfactory.gettrustmanagers(), null);
sslfilter = new sslfilter(context);
sslfilter.setuseclientmode(false);
sslfilter.setneedclientauth(false);
sslfilter.setwantclientauth(false);
session.getfilterchain().addfirst("tls", sslfilter);
session.setattribute(sslfilter.disable_encryption_once, true);
客戶端:
sslcontext context = sslcontext.getinstance("tls");
keymanage***ctory keyfactory = keymanage***ctory.getinstance(keymanage***ctory.getdefaultalgorithm());
trustmanage***ctory trustfactory = trustmanage***ctory.getinstance(trustmanage***ctory.getdefaultalgorithm());
keystore ks = keystore.getinstance("jks");
keystore tks = keystore.getinstance("jks");
ks.load(new fileinputstream("kclient.keystore"), "密碼".tochararray());
tks.load(new fileinputstream("tclient.keystore"), "密碼".tochararray());
keyfactory.init(ks, "密碼".tochararray());
trustfactory.init(tks);
context.init(null, trustfactory.gettrustmanagers(), null);
sslfilter = new sslfilter(context);
sslfilter.setuseclientmode(true);
session.getfilterchain().addfirst("tls", sslfilter);
可以用網路抓包工具看到加入tls之後的資料是經歷加密之後傳輸的
在mina中實現TSL SSL雙向認證連線(2)
上回書說到.書接上回,現在介紹第二種實現方式 server端和client端各自擁有自簽名的私有金鑰證書,並且互相交換公鑰,通過對方公鑰互相信認對方證書。1.建立server端keystore檔案serverkeys.jks,包含乙個用於伺服器的證書 quote keytool genkey ali...
在mina中實現TSL SSL雙向認證連線( )
現在介紹第三種實現方式 server端和client端各自擁有可信認的第三方認證機構 簽名私有金鑰證書,通過 互相信認對方證書。在第二種實現方式中,使用keytool生成的數字證書只能是自簽名的。謂自簽名就是指證書只能保證自己是完整的,沒有經過非法修改的。但是無法保證這個證書是屬於誰的。這種驗證有乙...
雙向認證 什麼是單向認證和雙向認證?
雙向認證 ssl 協議要求伺服器和使用者雙方都有證書。單向認證 ssl 協議不需要客戶擁有ca證書,具體的過程相對於上面的步驟,只需將伺服器端驗證客戶證書的過程去掉,以及在協商對稱密碼方案,對稱通話金鑰時,伺服器傳送給客戶的是沒有加過密的 這並不影響 ssl 過程的安全性 密碼方案。這樣,雙方具體的...