TLS如何實現各種功能?數據如何加密在網絡上傳輸?
網景(Netscape)公司在應用層和傳輸層加入了半層,把這個半層稱之為SSL,SSL不是軟件,可以理解是一個庫,當http交給tcp層之前先通過ssl進行封裝,所以http就成為https,ftp變為ftps等。SSL有三個版本V1、V2、V3,目前只有V2、V3在用。
由於SSL是私有的,所以國際化組織開發出TLS(安全傳輸協議)用於在兩個通信之間提供保密性和數據完整性。TLSv1=SSLv3
SSL協議結構
SSL協議本身可以分為兩層:底層為SSL記錄協議(SSL record protocol);上層為SSL握手協議(SSL handshake protocol)、SSL密碼變化協議(SSL change cipher spec protocol)和SSL警告協議(SSL alert protocol)。
SSL握手協議:是SSL協議非常重要的組成部分,用來協商通信過程中使用的加密套件(對稱加密算法、密鑰交換算法和MAC算法等)、在服務器和客戶端之間安全地交換密鑰,實現服務器和客戶端的身份驗證。客戶端和服務器通過握手協議建立一個會話。會話包含一組參數,主要有會話ID、對方的證書、加密套件(包括密鑰交換算法、數據加密算法和MAC算法)及主密鑰。
SSL密碼變化協議:客戶端和服務器端通過密碼變化協議通知對端,隨后的報文都將使用新協商的加密套件和密鑰進行保護和傳輸。
SSL警告協議:用來允許一方向另一方報告告警信息。消息中包含告警的嚴重級別和描述。
SSL記錄協議:主要負責對上層的數據進行分塊、計算並添加MAC、加密,最后把記錄塊傳輸給對方。
消息傳輸過程中使用基於密鑰的MAC(Message Authentication Code,消息驗證碼)來檢驗消息的完整性。MAC是將密鑰和任意長度的數據轉換為固定長度數據的一種算法。利用MAC算法驗證消息完整性的過程如圖所示。發送者在密鑰的參與下,利用MAC算法計算出消息的MAC值,並將其加在消息之后發送給接收者。接收者利用同樣的密鑰和MAC算法計算出消息的MAC值,並與接收到的MAC值比較。如果二者相同,則報文沒有改變;否則,報文在傳輸過程中被修改,接收者將丟棄該報文。
SSL會話建立
兩台主機之間SSL會話是如何建立的?以http為例,https使用443端口
在沒有使用SSL的時候建立三次握手后即可通信,當使用SSL時,三次握手后,
①客戶端請求,服務端收到請求后與客戶端協商建立SSL(如:協議版本、加密算法等)
②服務器把證書發給客戶端
③客戶端獲取證書之后要驗證證書(頒發機構信任)
④客戶端生成一個會話密鑰(對稱加密密鑰)並發給服務器端
⑤服務端就可加密數據發送
SSL程序軟件--openssl
加密解密算法實現工具(程序)有openssl和gpg
OPENSSL:SSL的開源實現,實現了大部分算法,該軟件有三部分組成
libcrypto:通用加密庫,其他軟件鏈接到庫文件即可實現功能
libssl:TLS/SSL的實現,實現了數據傳輸的三種特性的庫
openssl:命令行工具,可實現私有證書頒發機構以及加解密等功能。
openssl配置文件:/etc/pki/tls/openssl.conf 主要在實現CA時使用
查看openssl的子命令:[root@host]#openssl ?
openssl speed [算法名] #測試算法加密速度
openssl enc #先使用whatis查看,再使用man+whatis信息查找幫助
使用enc子命令進行加密
openssl enc –e -des3 -salt -a -in inittab -out inittab.deb3
-e/d:e是表示加密,d是表示解密
-des3:指定加密算法
-salt:為了和openssl0.9.5以后的版本兼,容默認設置。這是經過加密后放在密碼最前面的一段字符串,用途也是為了讓破解更難。
-a :當進行加解密時,他只對數據進行運算,有時需要進行base64轉換,設置此選項后加密結果進行base64編碼,解密前先進行base64編碼。
-in :輸入文件,缺省為標准輸入
-out :輸出文件,缺省為標准輸出
使用 –d選項進行解密
openssl enc –d -des3 -d -salt -in inittab.des3 -out inittab
使用單向加密獲得指紋
[root@host]#md5sum inittab 或者openssl dgst –md5 inittab
[root@host]#sha1sum inittab
如何給用戶生成密碼?openssl passwd -1 -salt 不使用salt選項會使用隨機salt ,-1表示md5
openssl的rsa實現:rsa子命令是RSA key processing tool,而rsautil才是加解密工具 ,但是公鑰一般不用於加密
生成隨機數
rand子命令:openssl rand -base64 長度 ,生成指定長度的隨機數
隨機數的來源:收集磁盤IO的中斷時間間隔或者敲擊鍵盤的時間間隔作為隨機數,生成的隨機數會保存在一段內存空間(熵池),當使用隨機數過量的時候,熵池沒有隨機數可用了可以通過大量磁盤IO讓其重新生成
/dev/random 僅從熵池中取數據,沒有數據之后會阻塞
/dev/urandom 熵池沒有數據后軟件生成隨機數
使用openssl構建私有CA
步驟一:生成一對密鑰,生成RSA,使用子命令genrsa,生成私鑰,從私鑰提取公鑰
[root@host]#openssl genrsa #默認生成512位
[root@host]#openssl genrsa 2048 #指定生成多少位
[root@host]#openssl genrsa 2048 > server.key #保存結果
修改server.key權限為600,私鑰十分重要應只允許屬主訪問
或者在子shell中直接生成指定權限的密鑰文件,注意秘鑰長度參數不能寫在前
[root@host]#(umask 077;openssl genrsa -out server.key 2048)
[root@host]#openssl rsa -in server1024key -pubout #從私鑰中提取公鑰
-in 指定輸入key位置文件,-pubout輸出
步驟二:生成自簽署證書;使用req子命令。
[root@host]#openssl req -new -x509 -key server1024.key -out server.crt -day 365
Country Name (2 letter code) [XX]:CN #國家名稱
State or Province Name (full name) []:Huizhou #省份名稱
Locality Name (eg, city) [Default City]:zhongkai #城市名稱
Organization Name (eg, company) [Default Company Ltd]:pk #公司名稱
Organizational Unit Name (eg, section) []:IT #組織單位
Common Name (eg, your name or your server's hostname) []:openhost #主機名稱
Email Address []:wjluo@pk.cn #郵件地址
-new :新的申請
-x509:生成自簽證書,專用於CA
-key server1024.key:指定密鑰(私鑰)文件
-out server.crt:輸出保存的位置和文件名
-day 365:指定證書有效期
文本格式輸出證書信息:openssl x509 -text -in serverkey.crt
此時,生成了密鑰和自簽證書之后仍不能使用,要根據/etc/pki/tls/openssl.cnf配置文件的配置路徑把證書放置在對應位置
【CA_default】
dir = /etc/pki/CA # CA的工作路徑,最好使用絕對路徑
certs = $dir/certs # 客戶端證書保存位置
crl_dir = $dir/crl # 證書吊銷列表保存位置
database = $dir/index.txt # 數據庫,給哪些人發了證(索引信息)
new_certs_dir = $dir/newcerts # 新生成證書保存位置
certificate = $dir/cacert.pem # CA自己的證書(要按照名稱生成)
serial = $dir/serial # 起始序列號,發出的證書編號
crlnumber = $dir/crlnumber # 證書撤銷列表編號
crl = $dir/crl.pem # 證書撤銷列表的文件是什么
private_key = $dir/private/cakey.pem # CA自己的私鑰
RANDFILE = $dir/private/.rand # 隨機數文件,會自動生成
default_days = 365 # 證書有效期限
default_crl_days= 30 # 證書吊銷后保留多長時間
【req_distinguished_name】 #設置默認值,生成自簽證書的時候不用交互輸入。
創建配置文件中存在的相關目錄文件,/etc/pki/CA
mkdir certs newcerts crl
touch index.txt
touch serial
echo 01>serial(給予起始號)
自此,CA可以正常接受其他客戶端申請
每一種服務都需要自己的證書,要有證書就需要公鑰,要獲得公鑰就需要私鑰。
以httpd為例:
1、 新建/etc/httpd/ssl/目錄,用於存放生成的文件
2、 生成httpd應用的私鑰
注意這個私鑰和CA無關,是需要簽署的服務(另一台主機)生成的。
[root@host]#(umask 077;openssl genrsa -out httdd.key 1024)
3、 生成httpd的申請(填申請表)
[root@host]#openssl req -new -key httpd.key -out httpd.csr
填寫完信息后最好會詢問是否需要把請求加密存放,否就輸入空密碼
4、 把請求(申請表)發送給CA
[root@host]#openssl ca -in httpd.csr -out httpd.crt -day 365
5、 當前目錄就會有新簽好的證書
6、 可以發現serial文件序號自增1
吊銷證書
(一)客戶端
1、獲取證書serial
# openssl x509 -in /path/to/certificate_file.crt -noout -serial -subject
(二) CA
2、根據節點提交的serial和subject信息來驗正與index.txt文件中的信息是否一致;
3、吊銷證書
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
4、生成吊銷證書的編號(如果是第一次吊銷,生成此文件)
# echo 00 > /etc/pki/CA/crlnumber
5、更新證書吊銷列表
# cd /etc/pki/CA/crl/
# openssl ca -gencrl -out thisca.crl
如果需要,查看crl文件的內容:
# openssl crl -in /path/to/crlfile.crl -noout -text