Openssl開源安全套接字協議
簡介
SSL (Secure Socket Layer)叫做安全套接字協議,是一種應用層協議,主要用於傳輸數據的加密。 OpenSSL是SSL協議開源形式,是廣泛使用的商業及SSL工具,同時OpenSSL也是一種命令行工具。
在網絡中,主機之間的進程通信是通過套接字方式來實現的,服務器監聽在某個 TCP Socket之上(IP:Port),客戶端在本地打開一個隨機的 Socket,然後通過TCP/IP協議,將請求通過交換機、路由器層層轉發到目標服務器上,然後服務器可以判斷出客戶端請求的資源,進而轉交到應用層相關服務上,服務端應用進程從磁盤中獲得相應的資源信息,然後封裝成相應的網絡數據包格式以同樣的方式層層傳輸給客戶端對應的端口上。無論數據從應用層向下層傳輸還是從下層到應用層傳輸,每個層次中的協議都僅僅是對數據進行封裝解封裝,而裏面的數據本身並沒有發生變化,所以數據在發送過程當中是什麼就還是什麼,也就是說是明文發送的,沒有加密,任何人只要獲取到了相關的數據包就能夠通過其他方法獲知其中的明文內容;這也就相當於將自己的隱私亮相於大衆廣庭之下!因此就需要有一種加密機制能夠保護互聯網數據在傳輸工程中的隱私性了。
爲此NIST組織就規定了安全通訊的幾個要素,包括保密性、完整性和可用性。所謂保密性就是隱私性,完整性是指數據在傳輸過程中要保證能夠完整,另外還能夠保證在傳輸後能夠還原回原來的數據,並且還原後的數據還能夠使用。
而事實上,在互聯網上通信的數據面臨着多種多樣的安全風險,這些安全風險包括:被動風險和主動風險。被動風險主要是通過竊聽等方式來竊取用戶的信息;主動風險是通過身份僞裝、重放、消息篡改、拒絕服務風險方式來進行各種風險行爲。對此互聯網也必須採取一些安全機制來防範這些風險。安全機制有:加密、數字簽名、訪問控制、數據完整性驗證、認證交換、流量填充、路由控制、公證等方式,這些安全機制是通過安全服務來實現的,對應的有:認證服務、訪問控制服、數據保密性服務、數據完整性服務、不可否認性服務。爲了保證這些服務的實現,還需要通過一些密碼算法和協議(加密機制)來完成,常見的密碼算法和協議有:對稱加密、公鑰加密、單向加密、認證協議。
在Linux系統上常用的加密解密工具有兩個:OpenSSL和gpg。pgp是一個協議,而gpg是實現這個協議的一個軟件,因此說gpg是pgp的實現。
常見的加密算法和協議
-
對稱加密:加密和解密使用同一個密鑰,依賴於算法和密鑰,但其安全性依賴於密鑰而非算法;
常見的算法:
DES: Data Encryption Stand,56bits
3DES:
AES: Advanced Encrpytion Standard, (128bits, 192, 256, 384, 512bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性
(1)、加密、解密使用同一密鑰;
(2)、將明文分隔成固定大小的塊,逐個進行加密。
缺陷:
(1)、密鑰過多;
(2)密鑰分發; -
非對稱加密:採用的是公鑰加密方法,當然還需要另一個密鑰來解密,這個密鑰稱之爲私鑰,兩者統稱爲密鑰對兒。
私鑰:secret key,僅允許個人使用;
公鑰:public key,公開給所有人獲取。
公鑰是從私鑰中提取出來的;使用公鑰加密的數據,只能使用於此公鑰配對兒的私鑰解密,反之也是如此。
用處:
(1)、身份認證:私鑰擁有者用自己的私鑰加密的數據,只要用其公鑰能解密,即可認證其身份;
(2)、密鑰交換:與被通信方通信之前,首先獲取到對方的公鑰,自己生成一個加密密碼,用對方的公鑰加密,併發送給對方;
(3)、數據加密:
算法:
RSA
DSA
ELGamal
特性:
(1)、密鑰長度較大,例如512bits,2048bits,4096bits
(2)、加密解密分別使用密鑰對兒中的密鑰相對進行;
(3)、常用於數據簽名和密鑰交換。 -
單向加密:只能加密,不能解密,因爲解密過程是一個二次加密的過程;主要是提出數據的特徵碼;
特性:
(1)、定長輸出:無論原來的數據是多大級別,其加密結果長度一樣;
(2)、雪崩效應:原始數據微小改變,將會導致結果巨大變化;
(3)、不可逆:
算法:
MD5:128bits定長輸出;
SHA1:160bits定長輸出;
SHA256
SHA384
SHA512
CRC32
用處:
(1)、數據完整性(完整性校驗);
(2)、系統賬號密碼校驗。
如:
/etc/shadow文件當中密碼字段是有多個字段組成,其中就包含有密碼的特徵值,然後在結合用戶輸入的明文密碼進行二次加密,將所得到的密文和文件中的密碼字段進行比對,比對成功則認證成功,否則失敗。 - 密鑰交換,IKE( Internet Key Exchange):雙方通過交換密鑰來實現數據加密解密;密鑰交換有以下兩種:
公鑰加密:將公鑰加密後通過網絡傳輸到對方進行解密,這種方式還有很大可能被截取破解,不常用;
DH:( Deffie-Hellman):雙方共有一些參數,共同協商加密算法,除此之外雙方還有屬於自己的私有參數,通過共有的參數、私有參數和算法信息來進行加密,然後雙方將計算後的結果進行交換,交換完成後再和屬於自已私有的參數進行特殊算法,經過雙方計算後的結果是相同的,而這個結果就是密鑰。
如:
A有p和g兩個參數,A還有一個屬於自己的私有參數x;
B有p和g兩個參數,B還有一個屬於自己的私有參數y;
A: P^X%G
B: P^Y%G
然後上方交換計算後的結果,此時
A拿到B的P^Y%G,B拿到A的P^X%G,雙方再和自己私有參數進行相同的算法,即:
A:對(P^Y%G)再求x次方得(P^Y%G)^X=P^XY%G
B:對(P^X%G)再求y次方得(P^X%G)Y=P^XY%G
最後A和B的結果是一樣的。
注意:整個過程中對於第三方人員來說只能獲取p、g兩個值,AB雙方交換的是經過計算後的值,因此這種加密方式是很安全的。
一次加密通信過程
發送者:
1、使用單向加密算法提取生成數據的特徵碼;
2、使用自己的私鑰加密特徵碼附加在數據後面;
3、生成用於對稱加密的臨時密鑰;
4、用此臨時密鑰加密數據和已經使用私鑰加密後的特徵碼;
5、使用接收方的公鑰加密此臨時密鑰,附加在對稱加密後的數據後方;
接收方:
1、使用自己的私鑰解密加密的臨時密鑰:從而獲得對稱密鑰;
2、使用對稱密鑰解密對稱加密的數據和私鑰加密的特徵碼密文:從而獲得數據和特徵碼密文;
3、使用發送方的公鑰解密特徵碼密文,從而獲得從計算生成的特徵碼;
4、使用與對方同樣的單向加密算法計算數據的特徵碼,並與解密而來的進行比較
數字證書
在雙方通訊過程中,數據的加密解密依賴於對方的公鑰,因此就需要一種可靠機制能夠保證公鑰數據的安全性,這種機制就是CA,CA是一個證書頒發機構,這個機構負責證書的頒發,誰需要就去CA購買,買完之後去驗證證書就可以了。那我們如何知道或者確定一個證書就是正規的CA頒發的呢?
我們來捋一捋
A要給B進行通信,A將自己的公鑰發給B,那B就需要知道A發過來的公鑰是否爲正規的CA顧發的,A在獲得CA給其頒發的證書時會在證書上面蓋上一個戳,那因此我們就需要通過驗證戳的真實性來驗證A的公鑰的合法性,所以上面的問題關鍵點就在於驗證CA所蓋的戳了,那怎麼驗證呢?解鈴還須繫鈴人,我們可以通過驗證CA自身的證書就可以嘛!那CA的證書又從哪裏獲得呢?我們不可能從互聯網上去下載,因爲從互聯網上獲得的證書是不可信賴的,既然不能通過互聯網獲得,就這得從操作系統上獲得,也就是說系統發行廠商會把這些CA證書做進操作系統裏面,在需要的時候可以直接去比對,如果操作系統中沒有固化的這些CA證書,那麼就可以說明該CA證書是不合法的。
CA只是PKI(Public Key Infrastructure 公鑰基礎設施)的一個組成部分,PKI包括:
簽證機構:CA,相當於我們辦理×××時的公安局(真正頒發證件的機構)
註冊機構:RA,相當於我們辦理×××時的派出所(幫你拍照信息錄入的機構)
證書吊銷列表:CRL,相當於我們證件丟失時掛失的內容
證書存取庫:當別人去請求認證時的資料庫
數字證書的格式(x.509 v3)由以下幾個部分組成
版本號(version);
序列號(serial number):CA用於唯一標識此證書;
簽名算法標誌( Signature algorithm identifier);
發行者的名稱:即CA自己的名稱
有效期:兩個日期,起始日期和終止日期;
證書主體名稱:證書擁有者自己的名字;
證書主體公鑰信息:證書擁有者自己的公鑰;
發行商的惟一標識;
證書主體的惟一標識;
護展信息:
簽名:CA對此證書的數字簽名;
證書通常有兩類用途:用戶證書和主機證書(如:httpd);
SSL
SSL( Secure Sockets Layer,安全套接層)是爲網絡通信提供安全及數據完整性的一種安全協議。TLS(SSL的維承版本)與SSL在傳輸層對網絡連接進行加密。
SSL爲Netscape所研發,用以保障在Internet上數據傳輸的安全,利用數據加密(Encryption)技術,可確保數據在網絡上傳輸過程中不會被截取及竊聽。
SSL協議位於TCP/IP協議與各種應用層協議之間,爲數據通訊提供安全支持。SSL協議可分爲兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,爲高層協設提供數據封裝、壓縮、加密等基本功能的支持。SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。
SSL提供的服務有
(1)、認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
(2)、加密數據以防止數據中途被竊取;
(3)、維護數據的完整性,確保數據在傳輸過程中不被改變。
Openssl
Openssl是 ssl 的一個開源項目,其由三部分組成:
openssl:多用途命令行工具,每種功都能使用專用的子命令來實現;
libcrypto:加密、解密庫文件;
libssl:ssl協議實現
openssl命令:
子命令分類:標準命令、消息摘要命令、加密解密相關的命令
加密文件(對稱加密)
算法:des, 3des, aes, blowfish, twofish, idea, casts
工具:openss enc, gpg
enc工具:
# 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
單向加密:
算法:md5,shal
工具:openssl dgst, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum
# openssl dgst -CIPHER /PATH/TO/SOMEFILE...
MAC:消息認證碼,單向加密的一種延伸應用,用於實現在網絡通信中保證所傳輸的數據的完整性;
生成用戶密碼:
# openssl passwd -1 -salt 8bits 隨機數
生成隨機數:
# openssl rand -hex | -base64 NUM
公鑰加密:
工具:gpg, openssl rsautl
數字簽名:RSA, DSA, ELGamal
DSA:Digital Signature Algorithm
DSS:Digital Signature Standard
密鑰交換:
公鑰加密、DH
生成密鑰對兒:
操作過程:生成私鑰,從私鑰中提取公鑰
# openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS
注意:在bash命令行上放在小括號中執行的命令,其實是通過打開一個子shell進程進行的;
# (umask 077: openssl genrsa -out /PATH/TOPRIVATE_KEYFILE NUM_BITS)
私鑰中手動提取公鑰:
# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
隨機數生成器:random、urandom
首先說一說熵池的概念,在操作系統上有一個叫做熵池的地方,他是用來保存硬件中斷產生的隨機數(每一次硬件終端都會產生一個隨機數)。
/dev/random:僅從熵池中返回隨機數,當熵池中的隨機數耗盡時,取隨機數的進程將會被阻塞;
/dev/urandom:先從池中取隨機數,當熵池中的隨機耗盡時,就通過僞隨機數生成器生成隨機數;
數字證書的獲取
獲取證書的方法有兩種:向RA註冊中請,或者自己建立私有CA。向RA註冊中請CA是需要花錢購買的,通常用於企業生產環境當中,以滿足業務的需求;但有時我們僅僅是用於企業內部自身使用或者是個人測試使用,因此我們就沒必要去花錢購買CA證書,而 OpenSSL 工具可以滿足我們創建私有CA的步驟。
使用OpenSSL構建私有CA的步驟:
1、生成私鑰;
2、生成自簽署證書;
(1)、私鑰用於簽發證書時,向證書添加數字簽名使用
(2)、證書:每個通信方都導入此證書至“受信任的證書頒發機構”;
涉及的配置文件:/etc/pki/tls/openssl.cnf
工作目錄: /ete/pki/CA
建立私有CA:
# openssl req - new x509 -key /etc/pki/CA/private/cakey.pem -out /ete/CA/cacert.pem -days 365
其中:
-new:生成新的證書籤署請求;
-key:私鑰文件路徑,用於提取公鑰;
-days N:證書有效時長,單位爲“天”;
-out:輸出文件保存位置
-x509:直接輸出自簽署的證書文件,通常只有構建CA時才這麼用;
3、提供輔助文件
# touch /etc/pki/CA/index.txt
# echo 01 > /etc/pki/CA/serial
給節點申請證書:
1、節點申請證書
在證書申請的主機上進行如下步驟:
(1)生成私鑰;
(2)生成證書籤署請求;
注意:
(a)其中的subject信息部分,要與CA的保持一致;
(b) Common Name要使用此主機在通信時使用真實名字;
(3)把請求發送給CA。
吊銷證書
1、獲取吊銷證書的序列號
# openssl x509 -in /PATH/FROM/CRT_FILE -noout -scrial -subject
2、實現證書吊銷
(1)吊銷證書
# openssl ca -revoke /PATH/FROM/CRT_FILE
(2)生成吊銷證書的編號
# echo 01 > /etc/pkie/CA/crlnumber
(3)更新證書吊銷列表
# openssl crl -gencrl -out THISCA.crl