友情提醒:文中實驗平臺爲vmware workstation10 + centos 6.6 x86_64,在實際環境中請謹慎使用文件提及的命令。
內容概括:
1.數據加密方式與使用場景
2.openssl命令的簡單使用
3.基於CentOS 6.6 X86_64平臺實現私有CA的功能
嘮叨兩句:寫這篇博文的目的一是對學習知識的總結,二是IT從業入門朋友提供一個參考。因不是專業研究加密和解密的人員,文中涉及的方式,顯的很膚淺,若讀者爲這方面的大牛或骨灰人物,請移步吧,畢竟每天你只有24小時。
一 數據加密的方式和使用場景
數據在互聯網中安全傳輸要做到3點:數據內容機密性/數據內容完整性/通信雙方的身份驗證。
1.1)數據內容的機密性
所謂機密性,就是數據內容在傳輸過程中不能被第三方偷窺到。做到這點一般就是把明文的數據變爲密文傳輸。這種轉換方式通常用到對稱加密。
對稱加密:數據發送方將明文數據和密鑰經加密算法特殊處理後,將其變爲密文發送出去。數據接收方接到數據後使用加密時相同的密鑰和加密算法的逆算法,將密文變爲明文。
組成部分:算法和密鑰。
特點:算法可能是公開的,安全性依賴密鑰。計算量小,加密速度快,效率高。
不足之處:密鑰的管理。與不同的通信對象通信,都要有不同的密鑰,還要定期的更換。
代表性算法:DES,3DES和AES。
使用場景:加密數據。
1.2)數據內容的完整性
所謂完整性,就是數據內容在傳送過程中不能被篡改。實現這一點通常是提取數據的特徵碼,只要通信雙方使用相同算法對數據提取的特徵碼一致,就說明數據內容沒有被篡改。使用單向加密是實現。
單向加密:
代表性算法:md5,sha1,sha512,CRC-32等。
特點:(1)定常輸出:不管源數據有多大和多小,在相同算法下計算出的結果長度都一致。
(2)雪崩效用:輸入內容微小改變,會引起計算結果的巨大改變。
(3)不可逆:不可通過特徵碼反向算出源數據。(MD5以被破解,可找度娘諮詢)
(4)輸入一樣輸出必然一樣。
使用場景:驗證數據內容的完整性。
1.3)通信雙發的身份驗證
所謂身份驗證,就是宣稱能驗證自己就是所宣稱的那個人。通常使用非對稱加密算法實現。
非對稱加密:又稱公鑰加密。生成一個私鑰,從私鑰中提取出公鑰。私鑰加密的數據,公鑰可以解密;公鑰加密的數據,私鑰可以解密。私鑰各自保存,公鑰是公開的。
A與B相互通信,A使用自己的私鑰加密數據,B使用A的公鑰解開被加密的數據,證明了A的身份。
而無法保證數據的機密性。
A與B相互通信,A使用B的公鑰加密數據,B可用配對兒的私鑰解密數據,這保證了數據的機密性,但是無法證明A的身份。
也就是說在非對稱加密中有的算法即可實現加密,又能實現數據的簽名。
代表算法:RSA(實現:加密和簽名)
DSA(實現:簽名)
特點:加密速度慢,很少用了加密數據內容,通常用來做簽名。
使用場景:標明自己的身份。
1.4) 現在以Tom和Jerry間傳遞文件/etc/fstab爲例,使用上面所述的三種方式實現數據的密文傳輸:
TOM端:
(1)Tom爲要爲傳輸的文件/etc/fstab 使用單項加密算法提取特徵碼M1。
(2)Tom使用自己的私鑰加密特徵碼M1而得到M2
(3)Tom將加密後的特徵碼M2與數據文件/etc/fstab使用臨時生成的密鑰C來進行二次加密得到數據D。
(4)Tom將臨時密鑰C使用Jerry的公鑰進行加密。
(5)Tom將被Jerry公鑰加密後的密鑰C與數據D一起發給Jerry。
Jerry端:
(6)Jerry使用將Tom發來的數據,進行分離,得到數據D與被加密的密鑰C。
(7)Jerry使用自己的私鑰能解開被加密的密鑰C,證明了密鑰C沒有被篡改。
(8)Jerry使用密鑰C能解開被加密的數據D,得到了特徵碼M2與文件/etc/fstab,證明可數據的機密性。
(9)Jerry使用TOM的公鑰解開被加密的特徵碼M2,得到特徵碼M1,這證明了Tom的身份。
(10)Jerry使用相同的算法算出/etc/fstab的特徵碼與M1相同,這證明了/etc/fstab文件的完整性。
上述流程看着很完美,其實是有缺陷的,就是Tom和Jerry怎樣安全的得到對方的公鑰?並且怎樣確認提供公鑰的就是Tom或者Jerry?
要解決這個問題必須使用CA證書。通信雙方向第三方公信機構申請數字證書,證明自己的身份,當通信方A拿到通信方B的數字證書後,根據B數字證書中包含的信息,即可驗證B的身份。就像我們都使用公安機關發佈的居民***證明自己的身份一樣。當前前提是這個第三方公信機構必須被雙發所信任,若不被信任,那麼上面的問題就是一個無解的,還是買張車票親自去對方公司算了。
CA這個簽證機構所頒發的數字證書中有什麼內容呢?
數字證書現在一般流行使用X509 v3的版本。
數字證書的格式(x.509 v3):
版本號(version)
序列號(serial number):CA用於惟一標識此證書;
簽名算法標誌(Signature algorithm identifier)
發行者的名稱:即CA自己的名稱;
有效期:兩個日期,起始日期和終止日期;
證書主體名稱:證書擁有者自己的名字
證書主體公鑰信息:證書擁有者自己的公鑰;
發行商的惟一標識:
證書主體的惟一標識:
擴展信息:
簽名:CA對此證書的數字簽名;
能在全互聯網通用的CA簽發的證書,申請是要花錢的,若是在自己公司內部使用的話,可自建私有CA來解決這個問題。
二 Openssl命令
在Centos 發行版Linux上提供一套名爲openssl的組件,能幫助我們構架私有CA。openssl組件包含下面的三部分:
libcrypto:加密、解密庫文件;
libssl: ssl協議實現
openssl:多用途命令行工具,每種功能都使用專用的子命令來實現 。
openssl命令是這個組件中一部分,是實現私有CA的工具,在真實構建私有CA之前,必須學學openssl命令。
openssl 提供三種命令:
標準子命令:也是一級子命令,主要是openssl命令提供的各個功能。例如:對稱加密相關的enc,單向加密相關的dgst,生成用戶密碼的passwd,生成隨機數的rand等。
消息摘要命令:這是二級子命令,主要用於指明單向加密時使用的算法,同標準子命令中的dgst連用。
加密解密相關的命令:這是二級子命令,主要用於指明加密解密中使用的算法類型。同標準子命令中的enc連用。
更詳細的請看$man openssl
1)顯示版本信息:使用命令openssl version
2)加密測試:使用命令openssl enc加密:
解析:$openssl enc -e -des3 -a -salt -in ./inittab -out ./inittab.jm1
enc:表明使用openssl命令是用來加密解密的
-e:表明是用來加密的
-d:表明是用來解密的,不能同-e一起使用。
-des3:表明加密的算法3DES
-a:加密後的文件內容爲bash64格式
-salt:自動給下面輸入的密鑰中加點料,防止被比對內容猜測密鑰
-in /path/to/file:指明要被加密的文件在何處,叫什麼名字
-out /path/to/file:指明文件加密後放置何處,叫什麼名字
更多open enc的使用,請看$man enc
3)解密測試:也是使用openssl enc:
解析:-d:是解密的意思,其餘參數請看2)中解釋。
4)獲取文件特徵碼:使用命令openssl dgst
解析:$openssl dgst -md5 /path/to/file
dgst:指明openssl中取文件的特徵碼
-md5:指明算法
/path/to/file:指明文件對象。
更對請參閱:$man dgst
5)生成RSA算法的私鑰:openssl genrsa:
解析:$openssl genrsa -out ./cakey.pem 1024
genrsa:指明使用rsa算法生成文件
-out /path/to/file:指明生成的文件放置位置
1024:指明稱爲私鑰的長度
*若想同時修改生成 的文件的權限可這樣寫:
$(umask 077;openssl genrsa -out ./cakey.pem 1024)
更多信息請查看$man genrsa
6)從私鑰中提取公鑰:
三.實現私有CA的功能
下面的過程在2臺測試機上實現:
IP:192.168.100.1 Hostname:caserver.lijun.com 角色:CA服務器
IP:192.168.100.2 Hostname:Test02.lijun.com 角色:證書申請者
3.1)建立私有CA(IP:192.168.100.1上實施)
步驟一:查看CA配置文件
在Centos上查看CA配置的文件/etc/pki/tls/openssl.cnf,比較重要的是下面這項:
------------------------------------------------------------------------
[ ca ]
41
42 dir = /etc/pki/CA # Where everything is kept #設定CA的工作目錄
43 certs = $dir/certs # Where the issued certs are kept #指定CA已簽署過的的證書存取庫的存放位置
44 crl_dir = $dir/crl # Where the issued crl are kept #指定CA吊銷的證書的吊銷列表的存儲位置
45 database = $dir/index.txt # database index file. #已簽署證書的索引信息
48 new_certs_dir = $dir/newcerts # default place for new certs. #新簽證書的位置
50 certificate = $dir/cacert.pem # The CA certificate #CA自己的證書位置
51 serial = $dir/serial # The current serial number #下一個被簽署的證書的序列號
52 crlnumber = $dir/crlnumber # the current crl number #已吊銷證書的編號
54 crl = $dir/crl.pem # The current CRL #當前crl編號的證書
55 private_key = $dir/private/cakey.pem# The private key #CA自己的私鑰文件
73 default_days = 365 # how long to certify for #CA簽署的證書的默認使用天數
74 default_crl_days= 30 # how long before next CRL #被吊銷的證書展示時常
---------------------------------------------------------------------------
要確保在CA的工作目錄下:下列目錄和文件的存在:
certs crl index.htx newcerts serial crlnumber private
步驟二:生成私鑰
步驟三:生成自簽署證書
3.2)生成證書申請(IP:192.168.100.2上實施)
3.3)CA爲申請者簽署證書(IP:192.168.100.1上實施)
要注意2個問題:
1.私鑰要加密保存
2.可研究下openca的用法,它更適合大型企業私有CA的建設。