Java对于SSL的支持以及证书的安装!
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
原文引用自:
https://evergreen-tree.github.io/articles/2016-05/daily-java-keytool-ssl-cacerts
https://evergreen-tree.github.io
?
隨著最近行業(yè)內(nèi)部對(duì)于安全的要求的提高,公司的各條業(yè)務(wù)線都紛紛切成SSL,雖然SSL未必說(shuō)一定安全,但是最起碼可以在一定程度上保證用戶免于網(wǎng)絡(luò)監(jiān)聽(tīng)的煩惱。在切換的過(guò)程中遇到過(guò)很多問(wèn)題,比如證書(shū),簽名以及升級(jí)之后跟各個(gè)客戶之間的聯(lián)調(diào)升級(jí)等。通過(guò)仔細(xì)的研究SSL不得不說(shuō),SSL還真是安全。
首先請(qǐng)?jiān)试S我對(duì)數(shù)學(xué)致敬:(g^b%p)^a%p=(g^a%p)^b%p,當(dāng)年創(chuàng)造這種算式的人是天才,無(wú)可比擬的天才。這篇文章在一定程度上解釋明白了秘鑰交換算法:http://my.oschina.net/u/1382972/blog/330456
什么叫做cacerts,certified authority certificates的縮寫(xiě)。就是存證書(shū)的地方
Transport Layer Security (TLS) 1.0 / Secure Sockets Layer (SSL) 3.0是我們的web體系中用來(lái)保護(hù)Client(瀏覽器)到服務(wù)器的交互的安全性的。使用了這兩種協(xié)議的交互方式叫做HTTPS
http://idiotechie.com/understanding-transport-layer-security-secure-socket-layer/
從網(wǎng)上摘抄來(lái)的一個(gè)介紹SSL流程的說(shuō)明:
SSL協(xié)議的工作流程:
服務(wù)器認(rèn)證階段:
SSL最核心的兩點(diǎn)就是交換秘鑰以及使用HASH算法進(jìn)行的數(shù)字簽名驗(yàn)證
- 1)客戶端向服務(wù)器發(fā)送一個(gè)開(kāi)始信息“Hello”以便開(kāi)始一個(gè)新的會(huì)話連接;
- 2)服務(wù)器根據(jù)客戶的信息確定是否需要生成新的主密鑰,如需要?jiǎng)t服務(wù)器在響應(yīng)客戶的“Hello”信息時(shí)將包含生成主密鑰所需的信息;
- 3)客戶根據(jù)收到的服務(wù)器響應(yīng)信息,產(chǎn)生一個(gè)主密鑰,并用服務(wù)器的公開(kāi)密鑰加密后傳給服務(wù)器;
- 4)服務(wù)器恢復(fù)該主密鑰,并返回給客戶一個(gè)用主密鑰認(rèn)證的信息,以此讓客戶認(rèn)證服務(wù)器。
用戶認(rèn)證階段:
- 在此之前,服務(wù)器已經(jīng)通過(guò)了客戶認(rèn)證,這一階段主要完成對(duì)客戶的認(rèn)證。經(jīng)認(rèn)證的服務(wù)器發(fā)送一個(gè)提問(wèn)給客戶,客戶則返回(數(shù)字)簽名后的提問(wèn)和其公開(kāi)密鑰,從而向服務(wù)器提供認(rèn)證。
通過(guò)上面的介紹可以看出來(lái),使用SSL進(jìn)行的網(wǎng)絡(luò)通訊,雖然內(nèi)容是基于TCP和HTTP的,但是因?yàn)閮?nèi)容是加密的,而且,每個(gè)客戶端向服務(wù)器發(fā)送的秘鑰是不同的,從而可以保證傳輸?shù)陌踩浴?/p>
TSL協(xié)議的工作流程
協(xié)議由兩層組成: TLS 記錄協(xié)議(TLS Record)和 TLS 握手協(xié)議(TLS Handshake)。
在SSL中會(huì)使用密鑰交換算法交換密鑰;使用密鑰對(duì)數(shù)據(jù)進(jìn)行加密;使用散列算法對(duì)數(shù)據(jù)的完整性進(jìn)行驗(yàn)證,使用數(shù)字證書(shū)證明自己的身份。好了,下面開(kāi)始介紹SSL協(xié)議。
好吧,以上的部分,對(duì)于非專業(yè)人員來(lái)講,只有以票友身份進(jìn)行參與的份兒,但是剛才標(biāo)亮的關(guān)鍵字也說(shuō)明了SSL或者TLS(高級(jí)的SSL)主要解決的就是交換秘鑰,對(duì)數(shù)據(jù)完整性負(fù)責(zé)和保證數(shù)據(jù)傳輸?shù)倪^(guò)程中不被破壞。
Java對(duì)于SSL的支持
上面說(shuō)到了需要交換秘鑰,需要數(shù)字證書(shū)驗(yàn)明正身,但是不敢什么樣的秘鑰,首先第一次傳輸?shù)臅r(shí)候都需要服務(wù)器把相關(guān)的秘鑰傳輸給客戶端,基本應(yīng)該包含DES的秘鑰跟RSA的公鑰,那么不管是DES的秘鑰還是RSA的公鑰,對(duì)于服務(wù)器來(lái)說(shuō)都是公用的,而且對(duì)于一臺(tái)服務(wù)器來(lái)說(shuō)可能需要支持多組這樣的私鑰跟公鑰,所以服務(wù)器以證書(shū)的形式保存一組秘鑰跟驗(yàn)證信息,所以就存在一個(gè)存儲(chǔ)跟使用的問(wèn)題。
keystore?- JVM用來(lái)存放證書(shū)的庫(kù)文件。
KeyTool?- JVM用來(lái)管理證書(shū)的工具。
因?yàn)樽C書(shū)本來(lái)就是需要被保護(hù),所以為了方便Java提供了工具供我們簡(jiǎn)單使用。
keystore的生成
keytool -genkey -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" -keyalg RSA -alias business -keypass kpi135 -keystore C:\working\mykeystore -storepass ab987c -validity 180參數(shù)說(shuō)明:
-genkey表示要?jiǎng)?chuàng)建一個(gè)新的密鑰
-dname表示密鑰的Distinguished Names,
CN=commonName OU=organizationUnit O=organizationName L=localityName S=stateName C=countryDistinguished Names表明了密鑰的發(fā)行者身份
-keyalg使用加密的算法,這里是RSA
-alias密鑰的別名
-keypass私有密鑰的密碼,這里設(shè)置為kpi135
-keystore 密鑰保存在C:\working目錄下的mykeystore文件中
-storepass 存取密碼,這里設(shè)置為ab987c,這個(gè)密碼提供系統(tǒng)從mykeystore文件中將信息取出
-validity該密鑰的有效期為 180天
cacerts證書(shū)文件(The cacerts Certificates File)
改證書(shū)文件存在于java.home\lib\security目錄下,是Java系統(tǒng)的CA證書(shū)倉(cāng)庫(kù)
CA證書(shū)的導(dǎo)入(Importing Certificates)
keytool -import -alias joe -file jcertfile.cer這個(gè)命令將證書(shū)文件jcertfile.cer中別名為joe的證書(shū)導(dǎo)入系統(tǒng)的受信任證書(shū)列表中 通常該命令用以導(dǎo)入來(lái)自CA中心的證書(shū)(Importing a Certificate for the CA)
導(dǎo)入被CA中心授權(quán)的證書(shū)(Importing the Certificate Reply from the CA)
keytool -import -trustcacerts -file VSMarkJ.cer證書(shū)的導(dǎo)出(Exporting Certificates)
keytool -export -alias jane -file janecertfile.cer?
轉(zhuǎn)載于:https://my.oschina.net/dwbin/blog/679904
總結(jié)
以上是生活随笔為你收集整理的Java对于SSL的支持以及证书的安装!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ssh开发中的DAO和DaoSuppor
- 下一篇: [Java入门笔记] Java语言基础(