互聯網形成的初期,更多關注的是設備之間通過網絡相互訪問功能的實現,我們都知道,兩個設備之間要想相互通信,就必需遵循某種協議,于是早期的互聯網也出現來眾多的協議,比如傳輸層最著名的協議就是tcp和udp,而應用層比較著名的協議有:http、ftp、pop、smtp、dns、telnet等等,而這些協議這開發初期,更多是關注功能的實現,數據這網絡上傳輸是明文方式的,很少關注兩個設備之間相互通信的安全性問題,而隨著互聯網不斷的高速發展,已經深入到社會的各行各業,無時無刻不在影響著人們的生活,對于一些安全性要求較高的行業,迫切的需要一種安全協議,以保重數據傳輸的安全性,于是就有來我們今天要談的OpenSSL。
在說OpenSSL之前,首先讓我們認識一下SSL,其實SSL是Secure Socket Layer的簡寫,也就是所謂的安全套接字層協議,以及其繼任者TLS(Transport Layer Security,傳輸層安全)是為網絡通信提供安全及數據完整性的一種安全協議,TLS和SSL都是在傳輸層對網絡進行加密,說到加密就不得不說一下加密的種類,常見的加密種類有:
1)對稱加密:加密和解密使用同一個密碼,它是將明文分隔成固定大小的塊,然后逐個進行加密。
2)公鑰加密:也叫非對稱加密,為什么叫非對稱加密那,是因為它是成對兒出現的,公鑰是從私鑰中提取而來,使用公鑰加密只能使用與此公鑰配對兒的私鑰解密,也就是所使用公鑰加密必須要有一對兒密鑰:私鑰(secret key)、公鑰(public key);公鑰加密常用于身份認證、密鑰交換、數據加密。
3)單項加密:提取數據的特征碼,由于具有定長輸出、雪崩效應、不可逆的特性,常用于驗證數據完整性使用。
SSL協議主要提供以下服務:
1)認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
2)加密數據以防止數據中途被竊?。?/span>
3)維護數據的完整性,確保數據在傳輸過程中不被改變。
有了以上SSL的認識之后,那么一次加密的通訊過程是怎么樣的呢?我們大致可以這樣理解,首先從發送方來講:
1)發送方會使用單項加密算法提取生成數據的特征碼
2)然后使用自己的私鑰加密特征碼附加到數據后面
3)生成用于對稱加密的臨時密鑰
4)用此臨時密鑰加密數據和已經使用私鑰加密后的特征碼
5)使用接收方的公鑰加密此臨時密鑰,附加在對稱加密后的數據后方
然后從接收方來講:
1)使用自己的私鑰解密加密的臨時密鑰;從而獲得對稱密鑰;
2)使用對稱密鑰解密對稱加密的 數據和私鑰加密的特征碼密文;從而獲得數據和特征碼密文;
3)使用發送方的公鑰解密特征碼密文,從而獲得從計算生成的特征碼;
4)使用與對方同樣的單向加密算法計算數據的特征碼,并與解密而來的進行比較;
從以上的介紹中我們可以簡單的了解到一次加密的通訊過程的大致步驟,但是實際的網絡通訊中遠不止這些,實際的網絡通訊架構中主要有C/S(客戶端/服務器)架構和B/S(瀏覽器/客戶端)兩種架構,就拿最常使用的Web服務來說,Web服務使用B/S(瀏覽器/客戶端)架構而且使用TCP這種可靠的有連接的協議,眾多的瀏覽器用戶如何去驗證一個網站確實是它聲稱的這個網站那,這里就牽涉到一個數字簽名和數字證書的問題了,我想每一個初學者都會產生這樣一個疑問,什么是數字證書,什么又是數字簽名?數字證書是由權威機構--CA證書授權(Certificate Authority)中心發行的,能提供在Internet上進行身份驗證的一種權威性電子文檔,人們可以在互聯網交往中用它來證明自己的身份和識別對方的身份。
數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用于鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。要想弄明白這個問題,可以參考這個網http://netsecurity.51cto.com/art/201108/287971.htm 這里圖文并茂的解釋了數字簽名和數字證書的作用,其實把數字簽名想象為現實中我們自己的簽名,把數字證書想象成我們每個人的身份證,這樣就更能幫助我們理解什么是數字簽名以及什么是數字證書,就好比我們每個人都可以自己簽名,但是每個人也必須有一張屬于自己的身份證一樣(當然個別神通廣大的人會擁有多張身份證的人不再我們的討論范圍內)。
說了這么多,讓我們來看看數字正常的格式是什么如下圖:
有了以上的基礎認識,對于我們理解和使用OpenSSL來講有著非常重要的作用,OpenSSL 是一個強大的安全套接字層密碼庫,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不應該只將其作為一個庫來使用,它還是一個多用途的、跨平臺的密碼工具包括了主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,并提供豐富的應用程序供測試或其它目的使用。
要想更好的使用OpenSSL先來認識一下OpenSSL的命令
前面曾提到OpenSSL是一個多用途的、跨平臺的密碼工具,那個OpenSSL如何對一個普通文件進行加解密、生成密碼、生成隨機數、生成私鑰那?
加密和解密:
openssl enc -e -CIPHERNAME -a -salt -in /PATH/FROM/SOMEFILE -out /PATH/TO/SOMECIPHERFILE
openssl enc -d -CIPHERNAME -a -salt -in /PATH/FROM/SOMECIPHERFILE -out /PATH/TO/SOMEFILE
enc是openssl的一個子命令,
-e表示加密
-d表示解密
-CIPHERNAME表示指明用那種算法進行加密
-salt表示隨機添加一段雜質
-in表示指明對那個文件進行加密
-out表示指明加密后輸出文件的路徑即名稱
單項加密:
openssl dgst -CIPHER /PATH/TO/SOMEFILE
dgst是openssl的一個單項加密子命令
– CIPHER表示指明加密算法
生成密碼:
openssl passwd -1 -salt NUM
生成隨機數:
openssl rand -hex|-base64 NUM
-hex表示以十六進制編碼格式輸出
-base64表示文本編碼格式輸出
生成私鑰:
openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS
genrsa是openssl命令生成私鑰的一個子命令
-out /PATH/TO/PRIVATE_KEYFILE 指明生成的私鑰輸出位置以及名稱
NUM_BITS指明生成私鑰的位數
從私鑰中提取公鑰:
openss l rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
rsa是openssl命令提取公鑰的一個子命令
-in /PATH/FROM/PRIVATE_KEY_FILE指明從哪個私鑰中提取
-pubout指明提取的公鑰的名稱
從以上可以看出openssl的強大功能,但是眾所周知數字證書是由權威機構--CA證書授權(Certificate Authority)中心發行的,那么如何構建我們自己的私有CA那,openssl同樣可以做到,首先來看構建私有CA的步驟:
1、生成私鑰文件
2、生成自簽證書
3、提供輔助文件
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
到此我們的私有CA已經建立完畢,但是建立私有CA的主要作用就是給各個節點發證書,這里我們在本機來模擬節點申請證書,節點申請證書需要如下步驟:
1、生成私鑰
2、生成證書簽署請求
3、把請求發送給我們建立的私有CA
由于我在本機請求,所以直接copy過去就可以
到此我們的節點申請證書的請求以及請求完畢,這時就需要私有CA為這個節點申請的證書做簽發證書,CA簽發證書同樣也有三個步驟:
1、驗證請求者的信息
2、簽發證書
3、把簽發好是證書發還給請求者
這時我們已經正常簽署了該節點的證書請求,該證書已經可以正常使用了。
以上說了這么多CA的相關信息,那CA證書到底有什么作用那?
1、驗證網站是否可信(針對HTTPS)有了證書之后,當你的瀏覽器在訪問某個 HTTPS 網站時,會驗證該站點上的 CA 證書(類似于驗證介紹信的公章)。如果瀏覽器發現該證書沒有問題(證書被某個根證書信任、證書上綁定的域名和該網站的域名一致、證書沒有過期),那么頁面就直接打開;否則的話,瀏覽器會給出一個警告,告訴你該網站的證書存在某某問題,是否繼續訪問該站點
大多數知名的網站,如果用了 HTTPS 協議,其證書都是可信的(也就不會出現上述警告)。所以,今后你如果上某個知名網站,發現瀏覽器跳出上述警告,你就要小心啦!
2、驗證某文件是否可信(是否被篡改)
證書除了可以用來驗證某個網站,還可以用來驗證某個文件是否被篡改。具體是通過證書來制作文件的數字簽名。
隨著互聯網越來越深入的發展,網絡的安全性越來越受到重視,掌握好OpenSSL的使用也將考驗每個運維工程師的所必備的技能。
原創文章,作者:zhang,如若轉載,請注明出處:http://www.www58058.com/9567