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效能與優化 客戶端發起請求,以明文傳輸請求資訊,包含版本資訊,加...