SSL連線,搭建網路安全道路
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 安全連線方式ssl(轉)
- mysql建立ssl安全連線的配置MySql
- FreeBSD安全連線方式SSL(轉)
- Netty 實現SSL安全連線(wss://)Netty
- 保護無線網路安全連線九個技巧
- Akka-CQRS(10)- gRPC on SSL/TLS 安全連線RPCTLS
- win10怎麼開啟網路連線的安全模式_Win10系統網路連線安全模式如何開啟Win10模式
- 網路安全系列之十九禁止建立ipc$連線
- proxool連線池如何使用SSL方式連線?
- 連線的力量網路安全進入合縱連橫的時代
- MySQL 5.7配置SSL連線MySql
- MySQL SSL連線問題MySql
- mysql之使用SSL連線MySql
- windows10系統下安全模式如何連線網路Windows模式
- VOIP連線員工,Juniper確保網路安全方案(轉)
- 使用iwctl連線無線網路
- 網路連線和概述
- mysql5.7 ssl加密連線MySql加密
- centos無法建立ssl連線CentOS
- RDSSQLServer設定SSL加密連線SQLServer加密
- 轉-配置openldap使用SSL連線LDA
- win10無線網路連線步驟_win10怎麼連線無線網路Win10
- WiFi連線風險造成個人資訊外洩網路安全需加強WiFi
- Docker網路雙向連線Docker
- 判斷網路是否連線
- Docker容器的網路連線Docker
- VirtualBox網路連線方式
- 檢查網路是否連線
- RPC連線btcd網路RPC
- Netty5使用自簽證書實現SSL安全連線Netty
- 無線網路安全攻防
- 無線連線提示“windows無法連線到選定網路,網路可能不在區域中Windows
- 菜鳥學網路之 —— 長連線和短連線
- MySQL 使用 SSL 連線(附 Docker 例子)MySqlDocker
- SSL連線建立過程分析(1)
- 手機網路連線效能API介面:查詢手機網路連線效能狀態API
- 網際網路的安全是如何保證的:TLS、SSL 和 CATLS
- 調查顯示網際網路14%SSL認證不安全