- Linux服務器安全策略詳解(第2版)
- 曹江華
- 3682字
- 2019-01-01 07:27:53
2.1 理解SSL和OpenSSL如何工作
2.1.1 SSL功能
SSL(Secure Socket Layer)是Netscape公司提出的主要用于Web的安全通信標準,有2.0版和3.0版。TLS(Transport Layer Security)是IETF的TLS工作組在SSL3.0基礎之上提出的安全通信標準,目前版本是1.0,即RFC2246.SSL/TLS,它提供的安全機制可以保證應用層數據在互聯網上傳輸不被監聽、偽造和竄改。
一般情況下,在網絡協議應用中,數據在機器中經過簡單的由上到下的幾次包裝后進入網絡,如果這些包被截獲,那么可以很容易地根據網絡協議得到里面的數據(由網絡監聽工具可以很容易地做到這一點)。
SSL就是為了加密這些數據而產生的協議,可以這么理解,它是位于應用層和TCP/IP之間的一層,數據經過它流出的時候被加密,再送往TCP/IP,而數據從TCP/IP流入之后先進入它這層被解密,同時它也能夠驗證網絡連接兩端的身份。
它的主要功能就是兩個:
① 加密、解密在網絡中傳輸的數據包,同時保護這些數據不被修改和偽造;
② 驗證網絡對話中雙方的身份。
SSL協議包含兩個子協議:一個是包協議;一個是握手協議。包協議是說明SSL的數據包應該如何封裝。握手協議則是說明通信雙方如何共同協商、決定使用什么算法及算法使用的key。包協議位于握手協議下一層。
2.1.2 SSL協議簡介
SSL協議工作在Linux TCP/IP協議和HTTP協議之間,SSL是一個介于HTTP協議與TCP協議之間的一個可選層,其關系如圖2-1所示。

圖2-1 SSL協議,Linux TCP/IP協議與其他協議之間的關系
SSL Handshake Protocol中文名稱是SSL握手協議,用來完成客戶端和服務器之間對話的建立。SSL握手協議是SSL協議中最復雜的協議。服務器和客戶端使用這個協議相互鑒別對方的身份、協商加密算法和MAC算法,以及在SSL記錄協議中加密數據的加密密鑰和初始向量。握手協議是建立SSL連接首先應該執行的協議,必須在傳輸任何數據之前完成。
SSL Change Cipher Spec Protocol中文名稱是SSL修改密文協議,以實際建立對話使用密碼組的約定。SSL Change Cipher Spec Protocol是一個最簡單的SSL相關協議,它只有一個報文,報文由值為1的單個字節組成。這個協議的唯一作用就是將掛起狀態復制到當前狀態,改變連接將要使用的密碼族。
SSL Alert Protocol中文名稱是SSL告警協議,在客戶端和服務器之間傳輸SSL出錯消息。SSL告警協議是將SSL有關的告警信息傳送給通信的對方實體。SSL告警協議跟其他使用SSL的應用協議(如HTTP協議)一樣,告警報文按照當前狀態說明被壓縮和加密。
SSL Record Protocol中文名稱是SSL記錄協議,為不同的高層協議提供安全服務,HTTP、FTP等高層應用協議都可以在SSL協議上運行。顧名思義,記錄協議是描述SSL信息交換的過程中的記錄格式。SSL協議介于應用層和網絡層之間,因此它會接收來自應用層的信息,并加以包裝后交由下一層(也就是網絡層來傳送)。
SSL層:借助下層協議的告警信道安全協商出一份加密密鑰,并用此密鑰來加密HTTP請求。TCP層:與Web Server的443端口建立連接,傳遞SSL處理后的數據。接收端與此過程相反。SSL在TCP之上建立了一個加密通道,通過這一層的數據都進行了加密,因此可以達到保密的效果。
2.1.3 SSL工作流程
如圖2-2所示是SSL工作流程圖。

圖2-2 SSL工作流程圖
SSL使用公用密鑰加密技術,服務器在連接結束時給客戶端發送公用密鑰用來加密信息,而加密的信息只有服務器用它自己持有的專用密鑰才能解開。客戶端使用公用密鑰加密數據,并且發送給服務器自己的密鑰,以唯一確定自己,防止在系統兩端之間有人冒充服務器或客戶端進行欺騙。加密的HTTP連接用443端口號代替80端口號,以區別于普通的不加密的HTTP。客戶端使用加密HTTP連接時會自動使用443端口而不是80端口,這使得服務器更容易做出相應的響應。SSL驗證和加密的具體過程如下。
(1)客戶端發送“你好”消息(以客戶端首選項順序排序),如SSL的版本、客戶端支持的密碼對和客戶端支持的數據壓縮方法。消息也包含28字節的隨機數。
(2)服務器以“你好”消息響應,此消息包含密碼方法(密碼對)和由服務器選擇的數據壓縮方法,以及會話標志和另一個隨機數。
注意 客戶端和服務器必須至少支持一個公共密碼對,否則握手失敗。服務器一般選擇最強大的公共密碼對。
(3)服務器發送其數字證書(服務器使用帶有SSL的X.509 V3數字證書)。如果服務器使用SSL V3,而服務器應用程序(如Web服務器)需要數字證書進行客戶端認證,則客戶端會發出“數字證書請求”消息。在“數字證書請求”消息中,服務器發出支持的數字證書類型的列表和可接受的認證中心的專有名稱。
(4)服務器發出“你好完成”消息并等待客戶端響應。
(5)接收到服務器“你好完成”的消息,客戶端(Web瀏覽器)將驗證服務器的數字證書的有效性并檢查服務器的“你好”消息參數是否可以接受。
如果服務器請求客戶端數字證書,客戶端將發送數字證書;如果沒有可用的合適的數字證書,客戶端將發送“沒有數字證書”告警。此告警僅僅是告警而已,如果客戶端認證是強制性的,服務器應用程序將會使會話失敗。
(6)客戶端發送“客戶端密鑰交換”消息。此消息包含pre-master secret(一個用在對稱加密密鑰生成中的46字節的隨機數字)和消息認證代碼(MAC)密鑰(用服務器的公用密鑰加密的)。如果客戶端發送數字證書給服務器,客戶端將發出簽有客戶端的專用密鑰的“數字證書驗證”消息。通過驗證此消息的簽名,服務器可以顯示驗證客戶端數字證書的所有權。如果服務器沒有屬于數字證書的專用密鑰,它將無法解密pre-master secret,也無法創建對稱加密算法的正確密鑰,握手將失敗。
(7)客戶端使用一系列加密運算將pre-master secret轉化為master secret,其中將派生出所有用于加密和消息認證的密鑰材料。然后,客戶端發出“更改密碼規范”消息將服務器密碼轉換為新協商的密碼對。客戶端發出的下一個消息(“未完成”的消息)為用此密碼方法和密鑰加密的第一條消息。
(8)服務器以自己的“更改密碼規范”和“已完成”消息響應。
(9)SSL握手結束,且可以發送加密的應用程序數據。
SSL協議有多種版本。SSL3.0的一個優點是增加了對加載證書鏈的支持,以允許服務器在發給瀏覽器的授予者證書上附加一個服務器證書。鏈的加載也允許瀏覽器驗證服務器證書,即使對此授予者的證書機構并沒有安裝,因為它已經包含在這個證書鏈中了。SSL3.0目前正由Internet Engineering Task Force(IETF)研發,是傳輸層安全(TLS)協議標準的基礎。
2.1.4 OpenSSL簡介
上面我們簡單介紹了SSL協議,與所有的協議一樣,都只是一些規則而已,真正要應用,必須將所有的協議規則轉換成代碼,對于任何個人和組織來說,這都是一項艱巨的任務,尤其是SSL協議這樣一種涉及諸多專業知識的協議。目前,主流的Web服務器和瀏覽器都支持SSL協議,但由于這些商業產品的源代碼不是開放的,使得對這些商業產品的信任和研究大大落后。
OpenSSL是一個開放源代碼的SSL協議的產品,它采用C語言作為開發語言。OpenSSL項目最早由加拿大人Eric A. Yang和Tim J. Hudson開發,現在由OpenSSL項目小組負責改進和開發,這個小組由全球的一些技術精湛的志愿人員組成,它們的勞動都是無償的。OpenSSL最早的版本在1995年發布,1998年以后開始由OpenSSL項目組維護和開發。當前最新的版本是0.9.7b版本,完全實現了對SSLV1、SSLV2、SSLV3、TLS的支持。OpenSSL的源代碼庫可以從OpenSSL的官方網站www.openssl.org自由下載,并可以免費用于任何商業或非商業的目的。由于采用C語言開發,OpenSSL的源代碼庫具有良好的跨系統性能,支持Linux、UNIX、Windows、Mac、VMS等多種平臺。目前,OpenSSL已經得到了廣泛的應用,大型軟件中的安全部分都使用了OpenSSL的庫,如VOIP的OpenH323協議、Apache服務器和Linux安全模塊等。
你可以選擇下面這份清單里的任何一種加密算法配合OpenSSL程序對文件加密。
● bf、bf-cbc、bf-cfb、bf-ecb、bf-ofb,Blowfish算法的各種變體。
● cast、cast-cbc,CAST算法兩種采用不同編碼方案的變體。cast5-cbc、cast5-cfb、cast5-ecb、cast5-ofb,CAST算法的改進版本,CAST5算法采用不同編碼方案的變體數量更多。
● des、des-cbc、des-cfb、des-ecb、des-ede、des-ede-cbc、des-ede-cfb、des-ede-ofb、des-ofb,DES算法的眾多變體中,有很多都是你平時用不上的。而且,DES現在已經不是最安全的加密算法了。
● des3、desx、des-ede3、des-ede3-cbc、des-ede3-cfb、des-ede3-ofb,DES3就是三重DES,它是DES算法的一種更先進、更安全的變體。
● idea、idea-cbc、idea-cfb、idea-ecb、idea-ofb,IDEA算法及其各種變體。
● rc2、rc2-cbc、rc2-cfb、rc2-ecb、rc2-ofb,RC2算法及其各種變體。
● rc4,RC4算法,無編碼變體。
● rc5、rc5-cbc、rc5-cfb、rc5-ecb、rc5-ofb,RC5算法及其各種變體。
2.1.5 OpenSSL的組成
雖然OpenSSL使用SSL作為其名字的重要組成部分,但其實現的功能卻遠遠超出了SSL協議本身。OpenSSL事實上包括了三部分:SSL協議、密碼算法庫和應用程序。
SSL協議部分完全實現和封裝了SSL協議的三個版本和TLS協議,SSL協議庫的實現是在密碼算法庫的基礎上實現的。使用該庫,你完全可以建立一個SSL服務器和SSL客戶端。該部分在Linux下編譯會形成一個名為libssl.a的庫,在Windows下則是名為ssleay32.lib的庫。
密碼算法庫是一個強大完整的密碼算法庫,它是OpenSSL的基礎部分,也是很值得一般密碼安全技術人員研究的部分,它實現了目前大部分主流的密碼算法和標準。主要包括公開密鑰算法、對稱加密算法、散列函數算法、X.509數字證書標準、PKCS12、PKCS7等標準。事實上,OpenSSL的SSL協議部分和應用程序部分都是基于這個庫開發的。目前,這個庫除了可以使用本身的默認算法外,在0.9.6版本之后,還提供了Engine機制,用于將如加密卡這樣外部的加密算法實現集成到OpenSSL中。密碼算法庫在Linux編譯后其庫文件名稱為libcrypto.a。
應用程序部分是OpenSSL最生動的部分,也是OpenSSL使用入門的部分。該部分基于上述的密碼算法庫和SSL協議庫實現了很多實用和示例性的應用程序,覆蓋了眾多的密碼學應用。主要包括了各種算法的加密程序和各種類型密鑰的產生程序(如RSA、Md5、Enc等)、證書簽發和驗證程序(如Ca、X.509、Crl等)、SSL連接測試程序(如S_client和S_server等),以及其他的標準應用程序(如Pkcs12和Smime等)。