TLS如何實現各類功能?數據如何加密在網絡上傳輸?算法
網景(Netscape)公司在應用層和傳輸層加入了半層,把這個半層稱之爲SSL,SSL不是軟件,能夠理解是一個庫,當http交給tcp層以前先經過ssl進行封裝,因此http就成爲https,ftp變爲ftps等。SSL有三個版本V一、V二、V3,目前只有V二、V3在用。shell
因爲SSL是私有的,因此國際化組織開發出TLS(安全傳輸協議)用於在兩個通訊之間提供保密性和數據完整性。TLSv1=SSLv3數據庫
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、加密,最後把記錄塊傳輸給對方。dom
消息傳輸過程當中使用基於密鑰的MAC(Message Authentication Code,消息驗證碼)來檢驗消息的完整性。MAC是將密鑰和任意長度的數據轉換爲固定長度數據的一種算法。利用MAC算法驗證消息完整性的過程如圖所示。發送者在密鑰的參與下,利用MAC算法計算出消息的MAC值,並將其加在消息以後發送給接收者。接收者利用一樣的密鑰和MAC算法計算出消息的MAC值,並與接收到的MAC值比較。若是兩者相同,則報文沒有改變;不然,報文在傳輸過程當中被修改,接收者將丟棄該報文。tcp
兩臺主機之間SSL會話是如何創建的?以http爲例,https使用443端口工具
在沒有使用SSL的時候創建三次握手後便可通訊,當使用SSL時,三次握手後,
①客戶端請求,服務端收到請求後與客戶端協商創建SSL(如:協議版本、加密算法等)
②服務器把證書發給客戶端
③客戶端獲取證書以後要驗證證書(頒發機構信任)
④客戶端生成一個會話密鑰(對稱加密密鑰)併發給服務器端
⑤服務端就可加密數據發送
加密解密算法實現工具(程序)有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 熵池沒有數據後軟件生成隨機數
步驟一:生成一對密鑰,生成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爲例:
一、 新建/etc/httpd/ssl/目錄,用於存放生成的文件
二、 生成httpd應用的私鑰
注意這個私鑰和CA無關,是須要簽署的服務(另外一臺主機)生成的。
[root@host]#(umask 077;openssl genrsa -out httdd.key 1024)
三、 生成httpd的申請(填申請表)
[root@host]#openssl req -new -key httpd.key -out httpd.csr
填寫完信息後最好會詢問是否須要把請求加密存放,否就輸入空密碼
四、 把請求(申請表)發送給CA
[root@host]#openssl ca -in httpd.csr -out httpd.crt -day 365
五、 當前目錄就會有新簽好的證書
六、 能夠發現serial文件序號自增1
吊銷證書
(一)客戶端
一、獲取證書serial
# openssl x509 -in /path/to/certificate_file.crt -noout -serial -subject
(二) CA
二、根據節點提交的serial和subject信息來驗正與index.txt文件中的信息是否一致;
三、吊銷證書
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
四、生成吊銷證書的編號(若是是第一次吊銷,生成此文件)
# echo 00 > /etc/pki/CA/crlnumber
五、更新證書吊銷列表
# cd /etc/pki/CA/crl/
# openssl ca -gencrl -out thisca.crl
若是須要,查看crl文件的內容: # openssl crl -in /path/to/crlfile.crl -noout -text