SSL連線,搭建網路安全道路

hdgara1發表於2020-03-16

SSL連線,搭建網路安全道路

什麼是 SSL連線

SSL 連線,當前版本為3.1(SSL3.1就是TLS1.0)。它已被廣泛地用於Web瀏覽器與伺服器之間的身份認證和加密資料傳輸.它位於TCP/IP協議與各種應用層協議之間,為資料通訊提供安全支援。SSL協議可分為兩層: SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供資料封裝、壓縮、加密等基本功能的支援。 SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的資料傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密金鑰等。

SSL連線建立過程

(以OpenSSL API為例)

OpenSSL是一套開放原始碼的SSL套件,其函式庫是以C語言所寫成,實現了基本的傳輸層資料加密功能。此軟體是以兩個加拿大人Eric A. Young 和Tim J. Hudson所寫的SSLeay為基礎所發展的,SSLeay隨著兩人前往RSA公司任職而停止開發。1998年,OpenSSL專案組接管了OpenSSL的開發工作,並推出了OpenSSL的0.9.1版,到目前為止,OpenSSL的演算法已經非常完善,對SSL2.0、SSL3.0以及TLS1.0都支援。

OpenSSL同時實現了客戶端與伺服器的開發介面,使用OpenSSL進行安全通訊的大致流程如下圖所示。

一、OpenSSL API

 

SSL通訊模型採用標準的C/S結構,因此基於OpenSSL的程式可以被分為兩個部分:Client和Server。上圖是建立SSL通訊的流程簡圖,說明了基於OpenSSL的程式所要遵循的以下幾個重要步驟:

(1)OpenSSL初始化

OpenSSL在使用之前,必須進行相應的初始化工作。完成初始化功能的函式原型為:

void SSL_load_error_strings(void); // 錯誤資訊的初始化

int SSL_library_int(void);         // 初始化SSL演算法庫函式( 載入要用到的演算法 ),呼叫SSL函式之前必須呼叫此函式

在建立SSL連線之前,要為Client和Server分別指定本次連線採用的協議及其版本,目前能夠使用的協議版本包括SSLv2、SSLv3、SSLv2/v3和TLSv1.0。SSL連線若要正常建立,則要求Client和Server必須使用相互相容的協議。

(2)建立CTX

在OpenSSL中,CTX是指SSL會話環境。建立連線時使用不同的協議,其CTX也不一樣。建立CTX的過程中會依次用到以下OpenSSL函式:

//客戶端、服務端都需要呼叫的

SSL_CTX_new()         //申請SSL會話環境

//若有驗證對方證照的需求,則需呼叫

SSL_CTX_set_verify()            //指定證照驗證方式

SSL_CTX_load_verify_location()  //為SSL會話環境載入本應用所信任的CA證照列表

//若有載入證照的需求,則需呼叫

SSL_CTX_use_certificate_file()       //為SSL會話載入本應用的證照

SSL_CTX_use_certificate_chain_file() //為SSL會話載入本應用的證照所屬的證照鏈

SSL_CTX_use_PrivateKey_file()        //為SSL會話載入本應用的私鑰

SSL_CTX_check_private_key()          //驗證所載入的私鑰和證照是否相匹配

(3)建立SSL套接字

在此之前要先建立普通的流套接字,完成TCP三次握手,建立普通的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);  //以只寫模式繫結流套接字

(4)完成SSL握手

在這一步,我們需要在普通TCP連線的基礎上,建立SSL連線。與普通流套接字建立連線的過程類似:Client使用函式SSL_connect()【類似於流套接字中用的connect()】發起握手,而Server使用函式SSL_ accept()【類似於流套接字中用的accept()】對握手進行響應,從而完成握手過程。兩函式原型如下:

int SSL_connect(SSL *ssl);

int SSL_accept(SSL *ssl);

握手過程完成之後,Client通常會要求Server傳送證照資訊,以便對Server進行鑑別。其實現會用到以下兩個函式:

X509 *SSL_get_peer_certificate(SSL *ssl);  //從SSL套接字中獲取對方的證照資訊

X509_NAME *X509_get_subject_name(X509 *a); //得到證照所用者的名字

(5)進行資料傳輸

經過前面的一系列過程後,就可以進行安全的資料傳輸了。在資料傳輸階段,需要使用SSL_read( )和SSL_write( )來代替普通流套接字所使用的read( )和write( )函式,以此完成對SSL套接字的讀寫操作,兩個新函式的原型分別如下:

int SSL_read(SSL *ssl,void *buf,int num);            //從SSL套接字讀取資料

int SSL_write(SSL *ssl,const void *buf,int num);     //向SSL套接字寫入資料

(6)會話結束

當Client和Server之間的通訊過程完成後,就使用以下函式來釋放前面過程中申請的SSL資源:

int SSL_shutdown(SSL *ssl);       //關閉SSL套接字

void SSl_free(SSL *ssl);          //釋放SSL套接字

void SSL_CTX_free(SSL_CTX *ctx);  //釋放SSL會話環境

全球可信CA機構

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31483669/viewspace-2680498/,如需轉載,請註明出處,否則將追究法律責任。

相關文章