關於web安全開發之SSL-TLS協議與JSSE的使用

SSL的全稱爲SecureSockets Layer, 即安全套接層。它是一種網絡安全協議,是網景在其推出的Web瀏覽器中同時提出的,目的是爲了保障網絡通訊的安全,校驗通訊雙方的身份,加密傳輸的數據。如圖算法

SSL協議的優點在於它與應用層協議獨立無關,高層的應用層協議如HTTP、SSH,FTP 竺等,能透明的創建於SSL協議之上,在應用層通訊以前就已經完成加密算法、通訊密鑰的協商以及服務端及客戶端的認證工做,在此以後全部應用層協議所傳輸的數據都會被加密,從而保證通訊的私密性。瀏覽器

SSL的繼任者是TLS協議全稱爲Transport Layer Security, 即傳輸層安全協議,是基於SSL協議的通用化協議,一樣位於應用層與傳輸層之間,正逐步接替SSL成爲下一代網絡安全協議。安全

SSL/TLS協議都可以分爲兩層:一層爲RecordProtocol, 即記錄協議;另外一層爲Handshake Protocol, 即握手協議。記錄協議創建在可靠的傳輸協議(如TCP)之上,提供數據封裝、加密解密、數據壓縮、數據校驗等基本功能。握手協議創建在記錄協議之上,在實際的數據傳輸開始前,進行加密算法的協商,通訊密鑰的交換,通訊雙方身份的認證等工做。bash

SSL握手協議比較複雜,它大體的工做流程如圖: 服務器

步驟以下:

1.客戶端發送一個客戶端的 say hello 信息,消息包含協議的版本信息,sessionid信息,客戶端支持的加密算法,壓縮算法信息,而且包含客戶端產生的隨機數。網絡

2.服務端響應server hello信息,消息包含服務端產生的隨機數協議版本等等客戶端相似的以及服務端數字證書。若是服務端配置的雙向認證,這時候服務端還要驗證客戶端證書。session

3.客戶端經過證書驗證服務端合法性。架構

4.若是證書驗證經過,客戶端向服務端發送通過服務端加密的預主密鑰(PreMaster Secret)PMS.假如服務端在上一個步驟請求了客戶端證書,客戶端會將客戶端證書發送給服務端校驗。分佈式

5.服務端驗證證書有效,並經過本身私鑰對PMS進行解密,使用客戶端發送的隨機數和服務端發送的隨機數,加上解密的PMS來生成主密鑰(MS),而後經過主密鑰來生成加密密鑰。工具

6.客戶端也將使用兩個隨機數加上PMS生成MS,而後經過MS生成加密密鑰。

客戶端:

7.通知服務端將來信息使用加密密鑰加密。

8.給服務端發送加密密鑰來加密信息,終止握手。

服務端

9.通知客戶端使用加密密鑰加密。

10.給客戶端發送加密密鑰,終止握手。

在服務端與客戶端真正的數據交換階段,實際上數據是經過對稱加密算法來實現加密的,密鑰爲雙方約定好的加密密鑰。客戶端首先使用加密密鑰來加密請求內容,發送給服務端,服務端使用加密密鑰對請求進行解密並處理相應的汕求,而後生成響應內容。響應通過加密密鑰。加密後,發送給客戶端,客戶端經過加密密鑰對響應內容進行解密,以得到響應內容。

SSL握手協議十分複雜,對於並不是密碼學專家的普通開發人員來講,理解上述交互過程確實不那麼容易,更別說對SSL/TLS協議進行實現。對於普通開發人員來講,他們關心的並非如何實現SSL/TLS協議,而是如何才能讓他們的程序以最簡潔的方式接入SSL/TLS強大的安全保護功能,JSSE正是這樣的一個工具。

JSSE (Java Security Socket Extension)是Sun公司爲了解決互聯網信息安全傳輸提出的一個解決方案,它實現了SSL和TSL協議,包含了數據加密、服務器驗證、消息完整性和客戶端驗證等技術。經過使用JSSE簡潔的APL能夠在客戶端和服務端之間經過SSL/TSL協議安全地傳輸數據。

首先,須要將前面3.2.5節所生成的客戶端及服務端私鑰和數字證書進行導出,生成Java環境可用的keystore文件。

客戶端私鑰與證書的導出:

openssl pkcs12 -export -clcerts -name 客戶端姓名(例如:  zengxinyao) -inkey private/client-key.pem -in certs/client.cer  -out /home/longlong/temp/testssl/client.keystore
複製代碼

服務端證書的導出:

openssl pkcsl2 -export -cl certs -name www. codeaholic. net -in key private/ server-key.pern -in certs/server.cer -out /horne/longlong/ternp/testssl/server.keystore
複製代碼

信任證書的導出: 因爲客戶端與服務端證書都是由下面的CA所頒發認證的,所以只須要將下面CA的根證書做爲信任庫,就能夠對以上的客戶端與服務端證書進行識別。

keytool -importcert -trustcacerts -alias *.codeaholic.net -file /home/longlong/ ca_dir/certs/ca.cer -keystore/home/longlong/temp/testssl/ca-trust.keystore 
複製代碼

使用 J S S E 進行 S S L /T S L 協議數據傳輸。 Java 實現的通訊客戶端。 SSLSocket 初始化:
初始化時首先取得 SSLContext、KeyManagerF actory 、TrustManagerFactory 的實例,而後加載客戶端的密鑰庫和信任庫到相應的 K eyStore, 對KeyManagerFactory 和 TrustM anagerFactory 進行初始化,最後用 K eyManager Factory 和 TrustM anagerFactory 對 SSLC ontext進行初始化,並建立 SSLSocket。 進行 SSL 通訊:
使用 SSLSocket 與使用 Socket 其實區別不大,process 方法將給服務端發送 "hello chenkangxian ! "這個字符串,並解析服務端的返回,而後進行輸出。

Java實現的通訊服務端。

與客戶端的初始化相似,服務端初始化時也是先取得 SSLContext、K eyM anagerFactory、 TrustManagerFactory 的實例,而後加載服務端的密鑰庫和信任庫到相應的 K eyStore, 對Key Manager Factory 和 TrustM anagerFactory 進行初始化 ,最後用 K eyManagerF actory 和TrustManagerF actory 對 SSLContext進行初始化,並建立 SSLServerSocket。 處理 SSL 請求:

服務端的 SSLServerSocket將在循環中不斷地接收客戶端的請求,將客戶端傳過來的字符串打印,並返回給客戶端 "bye bye!"。

摘自: 《大型分佈式網站架構設計與實踐》 閱讀筆記

相關文章
相關標籤/搜索