SSL連接,搭建網(wǎng)絡(luò)安全道路
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、順昌網(wǎng)站維護(hù)、網(wǎng)站推廣。什么是 SSL連接
SSL 連接,當(dāng)前版本為3.1(SSL3.1就是TLS1.0)。它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認(rèn)證和加密數(shù)據(jù)傳輸.它位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層: SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。 SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。
SSL連接建立過程
(以O(shè)penSSL API為例)
OpenSSL是一套開放源代碼的SSL套件,其函數(shù)庫是以C語言所寫成,實(shí)現(xiàn)了基本的傳輸層數(shù)據(jù)加密功能。此軟件是以兩個(gè)加拿大人Eric A. Young 和Tim J. Hudson所寫的SSLeay為基礎(chǔ)所發(fā)展的,SSLeay隨著兩人前往RSA公司任職而停止開發(fā)。1998年,OpenSSL項(xiàng)目組接管了OpenSSL的開發(fā)工作,并推出了OpenSSL的0.9.1版,到目前為止,OpenSSL的算法已經(jīng)非常完善,對SSL2.0、SSL3.0以及TLS1.0都支持。
OpenSSL同時(shí)實(shí)現(xiàn)了客戶端與服務(wù)器的開發(fā)接口,使用OpenSSL進(jìn)行安全通信的大致流程如下圖所示。
一、OpenSSL API
SSL通信模型采用標(biāo)準(zhǔn)的C/S結(jié)構(gòu),因此基于OpenSSL的程序可以被分為兩個(gè)部分:Client和Server。上圖是建立SSL通信的流程簡圖,說明了基于OpenSSL的程序所要遵循的以下幾個(gè)重要步驟:
(1)OpenSSL初始化
OpenSSL在使用之前,必須進(jìn)行相應(yīng)的初始化工作。完成初始化功能的函數(shù)原型為:
void SSL_load_error_strings(void); // 錯誤信息的初始化
int SSL_library_int(void); // 初始化SSL算法庫函數(shù)( 加載要用到的算法 ),調(diào)用SSL函數(shù)之前必須調(diào)用此函數(shù)
在建立SSL連接之前,要為Client和Server分別指定本次連接采用的協(xié)議及其版本,目前能夠使用的協(xié)議版本包括SSLv2、SSLv3、SSLv2/v3和TLSv1.0。SSL連接若要正常建立,則要求Client和Server必須使用相互兼容的協(xié)議。
(2)創(chuàng)建CTX
在OpenSSL中,CTX是指SSL會話環(huán)境。建立連接時(shí)使用不同的協(xié)議,其CTX也不一樣。創(chuàng)建CTX的過程中會依次用到以下OpenSSL函數(shù):
//客戶端、服務(wù)端都需要調(diào)用的
SSL_CTX_new() //申請SSL會話環(huán)境
//若有驗(yàn)證對方證書的需求,則需調(diào)用
SSL_CTX_set_verify() //指定證書驗(yàn)證方式
SSL_CTX_load_verify_location() //為SSL會話環(huán)境加載本應(yīng)用所信任的CA證書列表
//若有加載證書的需求,則需調(diào)用
SSL_CTX_use_certificate_file() //為SSL會話加載本應(yīng)用的證書
SSL_CTX_use_certificate_chain_file() //為SSL會話加載本應(yīng)用的證書所屬的證書鏈
SSL_CTX_use_PrivateKey_file() //為SSL會話加載本應(yīng)用的私鑰
SSL_CTX_check_private_key() //驗(yàn)證所加載的私鑰和證書是否相匹配
(3)創(chuàng)建SSL套接字
在此之前要先創(chuàng)建普通的流套接字,完成TCP三次握手,建立普通的TCP連接。然后創(chuàng)建SSL套接字,并將之與流套接字綁定。這一過程中會使用以下幾個(gè)函數(shù):
SSL *SSl_new(SSL_CTX *ctx); //創(chuàng)建一個(gè)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連接的基礎(chǔ)上,建立SSL連接。與普通流套接字建立連接的過程類似:Client使用函數(shù)SSL_connect()【類似于流套接字中用的connect()】發(fā)起握手,而Server使用函數(shù)SSL_ accept()【類似于流套接字中用的accept()】對握手進(jìn)行響應(yīng),從而完成握手過程。兩函數(shù)原型如下:
int SSL_connect(SSL *ssl);
int SSL_accept(SSL *ssl);
握手過程完成之后,Client通常會要求Server發(fā)送證書信息,以便對Server進(jìn)行鑒別。其實(shí)現(xiàn)會用到以下兩個(gè)函數(shù):
X509 *SSL_get_peer_certificate(SSL *ssl); //從SSL套接字中獲取對方的證書信息
X509_NAME *X509_get_subject_name(X509 *a); //得到證書所用者的名字
(5)進(jìn)行數(shù)據(jù)傳輸
經(jīng)過前面的一系列過程后,就可以進(jìn)行安全的數(shù)據(jù)傳輸了。在數(shù)據(jù)傳輸階段,需要使用SSL_read( )和SSL_write( )來代替普通流套接字所使用的read( )和write( )函數(shù),以此完成對SSL套接字的讀寫操作,兩個(gè)新函數(shù)的原型分別如下:
int SSL_read(SSL *ssl,void *buf,int num); //從SSL套接字讀取數(shù)據(jù)
int SSL_write(SSL *ssl,const void *buf,int num); //向SSL套接字寫入數(shù)據(jù)
(6)會話結(jié)束
當(dāng)Client和Server之間的通信過程完成后,就使用以下函數(shù)來釋放前面過程中申請的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)境
全球可信CA機(jī)構(gòu)
當(dāng)前文章:SSL連接,搭建網(wǎng)絡(luò)安全道路-創(chuàng)新互聯(lián)
鏈接分享:http://www.rwnh.cn/article18/csiodp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、App開發(fā)、微信小程序、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容