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