SSL協議的分析和實現

2021-06-20 02:04:37 字數 4596 閱讀 9695

1引言

ssl是一種在客戶端和伺服器端之間建立安全通道的協議。ssl一經提出,就在internet上得到廣泛的應用。ssl最常用來保護web的安全。為了保護存有敏感資訊web的伺服器的安全,消除使用者在internet上資料傳輸的安全顧慮。

openssl是乙個支援ssl認證的伺服器.它是乙個原始碼開放的自由軟體,支援多種作業系統。openssl軟體的目的是實現乙個完整的、健壯的、商業級的開放原始碼工具,通過強大的加密演算法來實現建立在傳輸層之上的安全性。openssl包含一套ssl協議的完整接 口,應用程式應用它們可以很方便的建立起安全套接層,進而能夠通過網路進行安全的資料傳輸。

2 ssl協議概述

ssl 以對稱密碼技術和公開密碼技術相結合,可以實現如下三個通訊目標:

(1)秘密性: ssl客戶機和伺服器之間傳送的資料都經過了加密處理,網路中的非法竊聽者所獲取的資訊都將是無意義的密文資訊。

(2)完整性: ssl利用密碼演算法和雜湊(hash)函式,通過對傳輸資訊特徵值的提取來保證資訊的完整性,確保要傳輸

的資訊全部到達目的地,可以避免伺服器和客戶機之間的資訊受到破壞。

(3)認證性:利用證書技術和可信的第三方認證,可以讓客戶機和伺服器相互識別對方的身份。為了驗證證書持有者是其合法使用者(而不是冒名使用者), ssl要求證書持有者在握手時相互交換數字證書,通過驗證來保證對方身份的合法性。

3 ssl協議的體系結構

ssl協議位於tcp/ip協議模型的網路層和應用層之間,使用tcp來提供一種可靠的端到端的安全服務,它是客戶/伺服器應用之間的通訊不被 攻擊竊聽,並且始終對伺服器進行認證,還可以選擇對客戶進行認證。ssl協議在應用層通訊之前就已經完成加密演算法、通訊金鑰的協商以及伺服器認證工作,在 此之後,應用層協議所傳送的資料都被加密。ssl實際上是共同工作的兩層協議組成,如圖1所示。從體系結構圖可以看出ssl安全協議實際是ssl握手協 議、ssl修改密文協議、ssl警告協議和ssl記錄協議組成的乙個協議族。

握手協議修改密文協議報警協議

ssl記錄協議

tcpip

圖1 ssl體系結構

ssl記錄協議為ssl連線提供了兩種服務:一是機密性,二是訊息完整性。為了實現這兩種服務, ssl記錄協議對接收的資料和被接收的資料工作過程是如何實現的呢? ssl記錄協議接收傳輸的應用報文,將資料分片成可管理的塊,進行資料壓縮(可選),應用mac,接著利用idea、des、3des或其他加密演算法進行 資料加密,最後增加由內容型別、主要版本、次要版本和壓縮長度組成的首部。被接收的資料剛好與接收資料工作過程相反,依次被解密、驗證、解壓縮和重新裝 配,然後交給更高階使用者。

ssl修改密文協議是使用ssl記錄協議服務的ssl高層協議的3個特定協議之一,也是其中最簡單的乙個。協議由單個訊息組成,該訊息只包含乙個值為1的 單個位元組。該訊息的唯一作用就是使未決狀態拷貝為當前狀態,更新用於當前連線的密碼組。為了保障ssl傳輸過程的安全性,雙方應該每隔一段時間改變加密規範。

ssl告警協議是用來為對等實體傳遞ssl的相關警告。如果在通訊過程中某一方發現任何異常,就需要給對方傳送一條警示訊息通告。警示訊息有兩種:一種是 fatal錯誤,如傳遞資料過程中,發現錯誤的mac,雙方就需要立即中斷會話,同時消除自己緩衝區相應的會話記錄;第二種是warning訊息,這種情 況,通訊雙方通常都只是記錄日誌,而對通訊過程不造成任何影響。ssl握手協議可以使得伺服器和客戶能夠相互鑑別對方,協商具體的加密演算法和mac演算法以 及保密金鑰,用來保護在ssl記錄中傳送的資料。

ssl握手協議允許通訊實體在交換應用資料之前協商金鑰的演算法、加密金鑰和對客戶端進行認證(可選)的協議,為下一步記錄協議要使用的金鑰資訊 進行協商,使客戶端和伺服器建立並保持安全通訊的狀態資訊。ssl握手協議是在任何應用程式資料傳輸之前使用的。ssl握手協議包含四個階段:第乙個階段 建立安全能力;第二個階段伺服器鑑別和金鑰交換;第三個階段客戶鑑別和金鑰交換;第四個階段完成握手協議。

4 ssl協議的實現

基於openssl的程式可以被分為兩個部分:客戶機和伺服器,使用ssl協議使通訊雙方可以相互驗證對方身份的真實性,並且能夠保證資料的完整性和機密性。建立ssl通訊的過程如圖2所示。

生成證書結構-->socket的過程-->socket和ssl聯絡起來-->ssl握手過程-->實現通訊

圖2 ssl通訊過程

ssl通訊模型採用標準的c/s結構,除了在tcp層上進行傳輸之外,與普通的網路通訊協議沒有太大的區別,基於openssl的程式都要遵循以下幾個步驟:

(1) openssl初始化

在使用openssl之前,必須進行相應的協議初始化工作,這可以通過下面的函式實現:

int ssl_library_int(void);

(2) 選擇會話協議

在利用openssl開始ssl會話之前,需要為客戶端和伺服器制定本次會話採用的協議,目前能夠使用的協議包括tlsv1.0、sslv2、sslv3、sslv2/v3。

需要注意的是,客戶端和伺服器必須使用相互相容的協議,否則ssl會話將無法正常進行。

(3) 建立會話環境

在openssl中建立的ssl會話環境稱為ctx,使用不同的協議會話,其環境也不一樣的。申請ssl會話環境的openssl函式是:

ssl_ctx *ssl_ctx_new(ssl_method * method);

當ssl會話環境申請成功後,還要根據實際的需要設定ctx的屬性,通常的設定是指定ssl握手階段證書的驗證方式和載入自己的證書。制定證書驗證方式的函式是:

int ssl_ctx_set_verify(ssl_ctx *ctx,int mode,int(*verify_callback),int(x509_store_ctx *));

為ssl會話環境載入ca證書的函式是:

ssl_ctx_load_verify_location(ssl_ctx *ctx,const char *cafile,const char *capath);

為ssl會話載入使用者證書的函式是:

ssl_ctx_use_certificate_file(ssl_ctx *ctx, const char *file,int type);

為ssl會話載入使用者私鑰的函式是:

ssl_ctx_use_privatekey_file(ssl_ctx *ctx,const char* file,int type);

在將證書和私鑰載入到ssl會話環境之後,就可以呼叫下面的函式來驗證私鑰和證書是否相符:

int ssl_ctx_check_private_key(ssl_ctx *ctx);

(4) 建立ssl套接字

ssl套接字是建立在普通的tcp套接字基礎之上,在建立ssl套接字時可以使用下面的一些函式:

ssl *ssl_new(ssl_ctx *ctx);

//申請乙個ssl套接字

int ssl_set_fd(ssl *ssl,int fd);)

//繫結讀寫套接字

int ssl_set_rfd(ssl *ssl,int fd);

//繫結唯讀套接字

int ssl_set_wfd(ssl *ssl,int fd);

//繫結只寫套接字

(5) 完成ssl握手

在成功建立ssl套接字後,客戶端應使用函式ssl_connect()替代傳統的函式connect()來完成握手過程:

int ssl_connect(ssl *ssl);

而對伺服器來講,則應使用函式ssl_ accept ()替代傳統的函式accept ()來完成握手過程:

int ssl_accept(ssl *ssl);

握手過程完成之後,通常需要詢問通訊雙方的證書資訊,以便進行相應的驗證,這可以借助於下面的函式來實現:

x509 *ssl_get_peer_certificate(ssl *ssl);

該函式可以從ssl套接字中提取對方的證書資訊,這些資訊已經被ssl驗證過了。

x509_name *x509_get_subject_name(x509 *a);

該函式得到證書所用者的名字。

(6) 進行資料傳輸

當ssl握手完成之後,就可以進行安全的資料傳輸了,在資料傳輸階段,需要使用ssl_read( )和ssl_write( )來替代傳統的read( )和write( )函式,來完成對套接字的讀寫操作:

int ssl_read(ssl *ssl,void *buf,int num);

int ssl_write(ssl *ssl,const void *buf,int num);

(7 ) 結束ssl通訊

當客戶端和伺服器之間的資料通訊完成之後,呼叫下面的函式來釋放已經申請的ssl資源:

int ssl_shutdown(ssl *ssl);

//關閉ssl套接字

void ssl_free(ssl *ssl);

//釋放ssl套接字

void ssl_ctx_free(ssl_ctx *ctx);

//釋放ssl會話環境

4 結束語

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

openssl是乙個開放源**的ssl協議的產品實現,它採用c語言作為開發語言,具備了跨系統的效能。呼叫openssl 的函式就可以實現乙個ssl加密的安全資料傳輸通道,從而保護客戶端和伺服器之間資料的安全。

https server的ssl協議實現

https協議簡單的說就是經過ssl加密的http協議,本文不介紹https server中http信令的實現,只介紹ssl的實現。使用openssl實現ssl,需要編譯openssl生成libssl.a和libcrypto.a 需要包含的標頭檔案 include初始化,cert path是證書檔案...

SSL安全協議實現的過程

ssl對通訊的對話過程進行安全保護 1.接通隊段 客戶機通過網路向伺服器打招呼,伺服器回應.2.密碼交換階段 客戶機與伺服器之間交換雙方認可的密碼,一般選用rsa密碼演算法,也有的選用diffie hellmanf和fortezza kea密碼演算法 3.會談密碼階段 客戶機與伺服器之間彼此交談的會...

ssl協議 wireshark抓包分析

wosign 專欄導航 https協議詳解 一 https基礎知識 https協議詳解 二 tls ssl工作原理 https協議詳解 三 pki 體系 https協議詳解 四 tls ssl握手過程 https協議詳解 五 https效能與優化 客戶端發起請求,以明文傳輸請求資訊,包含版本資訊,加...