1引言
SSL是一種在客戶端和服務(wù)器端之間建立安全通道的協(xié)議。SSL一經(jīng)提出,就在Internet上得到廣泛的應(yīng)用。SSL最常用來保護Web的安全。為了保護存有敏感信息Web的服務(wù)器的安全,消除用戶在Internet上數(shù)據(jù)傳輸?shù)陌踩檻]。
2 SSL協(xié)議概述
SSL是Secure socket Layer英文縮寫,它的中文意思是安全套接層協(xié)議,指使用公鑰和私鑰技術(shù)組合的安全網(wǎng)絡(luò)通訊協(xié)議。SSL協(xié)議是網(wǎng)景公司(Netscape)推出的基于 WEB應(yīng)用的安全協(xié)議,SSL協(xié)議指定了一種在應(yīng)用程序協(xié)議(如Http、Telenet、NMTP和FTP等)和TCP/IP協(xié)議之間提供數(shù)據(jù)安全性分 層的機制,它為TCP/IP連接提供數(shù)據(jù)加密、服務(wù)器認證、消息完整性以及可選的客戶機認證,主要用于提高應(yīng)用程序之間數(shù)據(jù)的安全性,對傳送的數(shù)據(jù)進行加 密和隱藏,確保數(shù)據(jù)在傳送中不被改變,即確保數(shù)據(jù)的完整性。
SSL 以對稱密碼技術(shù)和公開密碼技術(shù)相結(jié)合,可以實現(xiàn)如下三個通信目標:
(1)秘密性: SSL客戶機和服務(wù)器之間傳送的數(shù)據(jù)都經(jīng)過了加密處理,網(wǎng)絡(luò)中的非法竊聽者所獲取的信息都將是無意義的密文信息。
(2)完整性: SSL利用密碼算法和散列(HASH)函數(shù),通過對傳輸信息特征值的提取來保證信息的完整性,確保要傳輸
的信息全部到達目的地,可以避免服務(wù)器和客戶機之間的信息受到破壞。
(3)認證性:利用證書技術(shù)和可信的第三方認證,可以讓客戶機和服務(wù)器相互識別對方的身份。為了驗證證書持有者是其合法用戶(而不是冒名用戶), SSL要求證書持有者在握手時相互交換數(shù)字證書,通過驗證來保證對方身份的合法性。
3 SSL協(xié)議的體系結(jié)構(gòu)
SSL協(xié)議位于TCP/IP協(xié)議模型的網(wǎng)絡(luò)層和應(yīng)用層之間,使用TCP來提供一種可靠的端到端的安全服務(wù),它是客戶/服務(wù)器應(yīng)用之間的通信不被 攻擊竊聽,并且始終對服務(wù)器進行認證,還可以選擇對客戶進行認證。SSL協(xié)議在應(yīng)用層通信之前就已經(jīng)完成加密算法、通信密鑰的協(xié)商以及服務(wù)器認證工作,在 此之后,應(yīng)用層協(xié)議所傳送的數(shù)據(jù)都被加密。SSL實際上是共同工作的兩層協(xié)議組成,如圖1所示。從體系結(jié)構(gòu)圖可以看出SSL安全協(xié)議實際是SSL握手協(xié) 議、SSL修改密文協(xié)議、SSL警告協(xié)議和SSL記錄協(xié)議組成的一個協(xié)議族。
握手協(xié)議 | 修改密文協(xié)議 | 報警協(xié)議 |
SSL記錄協(xié)議 | ||
TCP | ||
IP |
SSL記錄協(xié)議為SSL連接提供了兩種服務(wù):一是機密性,二是消息完整性。為了實現(xiàn)這兩種服務(wù), SSL記錄協(xié)議對接收的數(shù)據(jù)和被接收的數(shù)據(jù)工作過程是如何實現(xiàn)的呢? SSL記錄協(xié)議接收傳輸?shù)膽?yīng)用報文,將數(shù)據(jù)分片成可管理的塊,進行數(shù)據(jù)壓縮(可選),應(yīng)用MAC,接著利用IDEA、DES、3DES或其他加密算法進行 數(shù)據(jù)加密,最后增加由內(nèi)容類型、主要版本、次要版本和壓縮長度組成的首部。被接收的數(shù)據(jù)剛好與接收數(shù)據(jù)工作過程相反,依次被解密、驗證、解壓縮和重新裝 配,然后交給更高級用戶。
SSL修改密文協(xié)議是使用SSL記錄協(xié)議服務(wù)的SSL高層協(xié)議的3個特定協(xié)議之一,也是其中最簡單的一個。協(xié)議由單個消息組成,該消息只包含一個值為1的 單個字節(jié)。該消息的唯一作用就是使未決狀態(tài)拷貝為當前狀態(tài),更新用于當前連接的密碼組。為了保障SSL傳輸過程的安全性,雙方應(yīng)該每隔一段時間改變加密規(guī)范。
SSL告警協(xié)議是用來為對等實體傳遞SSL的相關(guān)警告。如果在通信過程中某一方發(fā)現(xiàn)任何異常,就需要給對方發(fā)送一條警示消息通告。警示消息有兩種:一種是 Fatal錯誤,如傳遞數(shù)據(jù)過程中,發(fā)現(xiàn)錯誤的MAC,雙方就需要立即中斷會話,同時消除自己緩沖區(qū)相應(yīng)的會話記錄;第二種是Warning消息,這種情 況,通信雙方通常都只是記錄日志,而對通信過程不造成任何影響。SSL握手協(xié)議可以使得服務(wù)器和客戶能夠相互鑒別對方,協(xié)商具體的加密算法和MAC算法以 及保密密鑰,用來保護在SSL記錄中發(fā)送的數(shù)據(jù)。
SSL握手協(xié)議允許通信實體在交換應(yīng)用數(shù)據(jù)之前協(xié)商密鑰的算法、加密密鑰和對客戶端進行認證(可選)的協(xié)議,為下一步記錄協(xié)議要使用的密鑰信息 進行協(xié)商,使客戶端和服務(wù)器建立并保持安全通信的狀態(tài)信息。SSL握手協(xié)議是在任何應(yīng)用程序數(shù)據(jù)傳輸之前使用的。SSL握手協(xié)議包含四個階段:第一個階段 建立安全能力;第二個階段服務(wù)器鑒別和密鑰交換;第三個階段客戶鑒別和密鑰交換;第四個階段完成握手協(xié)議。
圖2 SSL通信過程
SSL通信模型采用標準的C/S結(jié)構(gòu),除了在TCP層上進行傳輸之外,與普通的網(wǎng)絡(luò)通信協(xié)議沒有太大的區(qū)別,基于OpenSSL的程序都要遵循以下幾個步驟:
(1) OpenSSL初始化
在使用OpenSSL之前,必須進行相應(yīng)的協(xié)議初始化工作,這可以通過下面的函數(shù)實現(xiàn):
int SSL_library_int(void);
(2) 選擇會話協(xié)議
在利用OpenSSL開始SSL會話之前,需要為客戶端和服務(wù)器制定本次會話采用的協(xié)議,目前能夠使用的協(xié)議包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。
需要注意的是,客戶端和服務(wù)器必須使用相互兼容的協(xié)議,否則SSL會話將無法正常進行。
(3) 創(chuàng)建會話環(huán)境
在OpenSSL中創(chuàng)建的SSL會話環(huán)境稱為CTX,使用不同的協(xié)議會話,其環(huán)境也不一樣的。申請SSL會話環(huán)境的OpenSSL函數(shù)是:
SSL_CTX *SSL_CTX_new(SSL_METHOD * method);
當SSL會話環(huán)境申請成功后,還要根據(jù)實際的需要設(shè)置CTX的屬性,通常的設(shè)置是指定SSL握手階段證書的驗證方式和加載自己的證書。制定證書驗證方式的函數(shù)是:
int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));
為SSL會話環(huán)境加載CA證書的函數(shù)是:
SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);
為SSL會話加載用戶證書的函數(shù)是:
SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,int type);
為SSL會話加載用戶私鑰的函數(shù)是:
SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx,const char* file,int type);
在將證書和私鑰加載到SSL會話環(huán)境之后,就可以調(diào)用下面的函數(shù)來驗證私鑰和證書是否相符:
int SSL_CTX_check_private_key(SSL_CTX *ctx);
(4) 建立SSL套接字
SSL套接字是建立在普通的TCP套接字基礎(chǔ)之上,在建立SSL套接字時可以使用下面的一些函數(shù):
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握手
在成功創(chuàng)建SSL套接字后,客戶端應(yīng)使用函數(shù)SSL_connect()替代傳統(tǒng)的函數(shù)connect()來完成握手過程:
int SSL_connect(SSL *ssl);
而對服務(wù)器來講,則應(yīng)使用函數(shù)SSL_ accept ()替代傳統(tǒng)的函數(shù)accept ()來完成握手過程:
int SSL_accept(SSL *ssl);
握手過程完成之后,通常需要詢問通信雙方的證書信息,以便進行相應(yīng)的驗證,這可以借助于下面的函數(shù)來實現(xiàn):
X509 *SSL_get_peer_certificate(SSL *ssl);
該函數(shù)可以從SSL套接字中提取對方的證書信息,這些信息已經(jīng)被SSL驗證過了。
X509_NAME *X509_get_subject_name(X509 *a);
該函數(shù)得到證書所用者的名字。
(6) 進行數(shù)據(jù)傳輸
當SSL握手完成之后,就可以進行安全的數(shù)據(jù)傳輸了,在數(shù)據(jù)傳輸階段,需要使用SSL_read( )和SSL_write( )來替代傳統(tǒng)的read( )和write( )函數(shù),來完成對套接字的讀寫操作:
int SSL_read(SSL *ssl,void *buf,int num);
int SSL_write(SSL *ssl,const void *buf,int num);
(7 ) 結(jié)束SSL通信
當客戶端和服務(wù)器之間的數(shù)據(jù)通信完成之后,調(diào)用下面的函數(shù)來釋放已經(jīng)申請的SSL資源:
int SSL_shutdown(SSL *ssl);
//關(guān)閉SSL套接字
void SSl_free(SSL *ssl);
//釋放SSL套接字
void SSL_CTX_free(SSL_CTX *ctx);
//釋放SSL會話環(huán)境
4 結(jié)束語
SSL協(xié)議采用數(shù)字證書進行雙端實體認證,用非對稱加密算法進行密鑰協(xié)商,用對稱加密算法將數(shù)據(jù)加密后進行傳輸以保證數(shù)據(jù)的保密性,并且通過計算數(shù)字摘要來驗證數(shù)據(jù)在傳輸過程中是否被篡改和偽造,從而為敏感數(shù)據(jù)在Internet上的傳輸提供了一種安全保障手段。
OpenSSL是一個開放源代碼的SSL協(xié)議的產(chǎn)品實現(xiàn),它采用C語言作為開發(fā)語言,具備了跨系統(tǒng)的性能。調(diào)用OpenSSL 的函數(shù)就可以實現(xiàn)一個SSL加密的安全數(shù)據(jù)傳輸通道,從而保護客戶端和服務(wù)器之間數(shù)據(jù)的安全。
參考文獻
[1] 信息系統(tǒng)安全[M].戴宗坤,羅萬伯 北京:電子工業(yè)出版社,2002
[2] 計算機網(wǎng)絡(luò)安全與加密技術(shù)[M]. 李海泉,李健.北京:科學(xué)出版社,2001
[3] SSL與TLS Designing and Building Secure Systems.北京:中國電力出版社,2002
[4] Network Security with Openss1.
Publisher:O’Reilly& Associates.2002