java中關於SSL/TSL的介紹和如何實現SSL Socket雙向認證

Franson發表於2016-06-01

一、        SSL概述

SSL協議採用數字證照及數字簽名進行雙端實體認證,用非對稱加密演算法進行金鑰協商,用對稱加密演算法將資料加密後進行傳輸以保證資料的保密性,並且通過計算數字摘要來驗證資料在傳輸過程中是否被篡改和偽造,從而為敏感資料的傳輸提供了一種安全保障手段。

SSL協議提供的服務主要有:

1)認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器

認證使用者和伺服器的合法性,使它們能夠確信資料將被髮送到正確的客戶機和伺服器上。客戶機和伺服器都有各自的識別號,這些識別號由公開金鑰進行編號,為驗證使用者是否合法,SSL協議要求在握手交換資料時進行數字認證,以此確保使用者的合法性。

2)加密資料以防止資料中途被竊取

SSL協議所採用的加密技術既有對稱金鑰技術,也有公開金鑰技術。在客戶機和伺服器進行資料交換前,交換SSL初始握手資訊,在SSL握手資訊中採用了各種加密技術對其進行加密,以保證其機密性和資料的完整性,並且用數字證照進行鑑別,這樣就可以防止非法使用者進行破譯。

3)維護資料的完整性,確保資料在傳輸過程中不被改變

SSL協議採用Hash函式和機密共享的方法提供資訊的完整性服務,建立客戶機和伺服器之間的安全通道,使所有經過SSL協議處理的業務在傳輸過程中能全部完整準確無誤的到達目的地。

 

SSL體系結構:

SSL協議位於TCP/IP協議模型的網路層和應用層之間,使用TCP來提供一種可靠的端到端的安全服務,它是客戶/伺服器應用之間的通訊不被攻擊竊聽,並且始終對伺服器進行認證,還可以選擇對客戶進行認證。SSL體系結構如圖1所示。

SSL Socket雙向認證的實現 - day day up - My Blog

SSL通訊中,首先採用非對稱加密交換資訊,使得伺服器獲得瀏覽器端提供的對稱加密的金鑰,然後利用該金鑰進行通訊過程中資訊的加密和解密。為了保證訊息在傳遞過程中沒有被篡改,可以加密HASH編碼來確保資訊的完整性。SSL通訊過程,如圖2所示。

SSL Socket雙向認證的實現 - day day up - My Blog

一般情況下,當客戶端是保密資訊的傳遞者時,客戶端不需要數字證照驗證自己身份的真實性,如電子銀行的應用,客戶需要將自己的賬號和密碼傳送給銀行,因此銀行的伺服器需要安裝數字證照來表明自己身份的有效性。在某些應用中,伺服器端也需要對客戶端的身份進行驗證,這時客戶端也需要安裝數字證照以保證通訊時伺服器可以辨別出客戶端的身份,驗證過程類似於伺服器身份的驗證過程。

 

三、SSL Socket雙向認證的實現

SSL Socket通訊是對Socket通訊的擴充。在Socket通訊的基礎上新增了一層安全性保護,提供了更高的安全性,包括身份驗證、資料加密以及完整性驗證。

SSL Socket雙向認證實現技術: JSSE(Java Security Socket Extension),它實現了SSL和TSL(傳輸層安全)協議。在JSSE中包含了資料加密,伺服器驗證,訊息完整性和客戶端驗證等技術。通過使用JSSE,可以在客戶機和伺服器之間通過TCP/IP協議安全地傳輸資料。為了實現訊息認證:

伺服器端需要:

   1、KeyStore: 其中儲存伺服器端的私鑰

   2、Trust KeyStore: 其中儲存客戶端的授權證照

客戶端需要:

    1、KeyStore:其中儲存客戶端的私鑰

    2、Trust KeyStore:其中儲存服務端的授權證照

 

金鑰和授權證照的生成方法:

使用Java自帶的keytool命令,在命令列生成。

1、生成伺服器端私鑰kserver.keystore檔案

  keytool -genkey -alias serverkey -validity 1 -keystore kserver.keystore

2、根據私鑰,匯出伺服器端安全證照

keytool -export -alias serverkey -keystore kserver.keystore -file server.crt  

3、將伺服器端證照,匯入到客戶端的Trust KeyStore中

keytool -import -alias serverkey -file server.crt -keystore tclient.keystore

4、生成客戶端私鑰kclient.keystore檔案

  keytool -genkey -alias clientkey -validity 1  -keystore kclient.keystore

5、根據私鑰,匯出客戶端安全證照

keytool -export -alias clientkey -keystore kclient.keystore -file client.crt

6、將客戶端證照,匯入到伺服器端的Trust KeyStore中

keytool -import -alias clientkey -file client.crt -keystore tserver.keystore

      

生成的檔案分成兩組,伺服器端儲存:kserver.keystore tserver.keystore 客戶端儲存:kclient.keystore  tclient.kyestore(通常情況下,我們也可以將對方的證照匯入自己存放私匙的keystore中)。

 身份驗證的原理

客戶端採用自己的私鑰進行資料加密,傳送給服務端,伺服器端採用客戶端的公匙(client.crt證照中存在)對資料解密,如果解密成功,證明訊息來自可信的客戶端,進行邏輯處理;

同理,伺服器端採用kserver.keystore中的私鑰進行資料加密,傳送給客戶端,客戶端採用tclient.keystore中的server.crt證照對資料解密,如果解密成功,證明訊息來自可信的伺服器端,進行邏輯處理。如果解密失敗,那麼證明訊息來源錯誤。不進行邏輯處理。

 

SSL Socket雙向認證的安全性:

1)可以確保資料傳送到正確的伺服器端和客戶端。

2)可以防止訊息傳遞過程中被竊取。

3)防止訊息在傳遞過程中被修改.。

 

在系統執行中可能出現以下情況:

(1)   伺服器端、客戶端都持有正確的金鑰和安全證照,此時伺服器端和客戶端可以進行正常通訊。

(2)   客戶端的金鑰和安全證照不正確,此時伺服器端和客戶端不可以進行正常通訊。

(3)   客戶端未持有金鑰和安全證照,此時伺服器端和客戶端也不可以進行正常通訊。

相關文章