前言
早期互聯(lián)網(wǎng)數(shù)據(jù)傳輸是基于TCP/IP模型完成數(shù)據(jù)交換,其各層對(duì)傳輸?shù)臄?shù)據(jù)包進(jìn)行各協(xié)議的封裝,從數(shù)據(jù)的發(fā)送方到接收方進(jìn)行的數(shù)據(jù)交換都是基于明文傳輸。在傳輸?shù)倪^(guò)程中數(shù)據(jù)的可以被中間人進(jìn)行攔截或抓取,威脅了數(shù)據(jù)的保密性(竊聽(tīng)、通信量分析)、數(shù)據(jù)的完整性(更改、偽裝、重放、否認(rèn))、數(shù)據(jù)的可用性攻擊(拒絕服務(wù)DOS及DDOS)。為了了達(dá)到安全,出現(xiàn)了技術(shù)的解決方案:加密和解密來(lái)抵御攻擊。
加密和解密算法和協(xié)議
1、對(duì)稱加密:
-
特性:
- 1、加密和解密使用同一密鑰,但雙方加密算法可以不同
- 2、將原始數(shù)據(jù)分割成固定大小塊,逐個(gè)進(jìn)行加密
- 3、加解密速度比較快
-
缺點(diǎn):
- 1、密鑰過(guò)多
- 2、密鑰分發(fā)困難
-
用途:
- 常見(jiàn)用于數(shù)據(jù)傳輸過(guò)程中的數(shù)據(jù)加密,
-
常見(jiàn)算法:
-
DES: Data ,基于64位明文產(chǎn)生64個(gè)密文,或者64位密文產(chǎn)生64位明文 -
3DES: triple DES -
AES: advanced Encryption standard,采用128、192、256、384位加密機(jī)制 BlowfishTwofishIDEARC16CAST5
-
2、非對(duì)稱加密(公鑰加密)
-
特性:
- 1、密鑰分為公鑰和私鑰,密碼都是成對(duì)出現(xiàn)。
- 2、私鑰可以解公鑰加密的數(shù)據(jù),公鑰也可以解私鑰加密的數(shù)據(jù)
- 3、公鑰從私鑰中提取產(chǎn)生,可以公開(kāi)給所有人,稱之為Public Key
- 4、私鑰通過(guò)工具創(chuàng)建,使用者自己留存,必須保證其私密性,稱之為Secret Key
-
缺點(diǎn)
- 加解密速度慢,一般比對(duì)稱加密要慢3個(gè)量級(jí)(一個(gè)量級(jí)是10倍)
- 中間人攻擊
-
用途
- 1、數(shù)字簽名
- 主要用于讓接收方確認(rèn)發(fā)送方的身份
- 2、密鑰交換
- 發(fā)送方使用公鑰加密一個(gè)對(duì)稱密鑰,并發(fā)送給對(duì)方
- 3、數(shù)據(jù)加密
- 1、數(shù)字簽名
數(shù)字簽名及密鑰交換過(guò)程說(shuō)明:
- 1、發(fā)送方使用單向加密算法計(jì)算數(shù)據(jù)的特征碼,用其私鑰加密特征碼,并附加在數(shù)據(jù)后面,
- 2、發(fā)送方再使用對(duì)稱加密算法生成密鑰,加密整個(gè)數(shù)據(jù),并拿到對(duì)方的公鑰,加密對(duì)稱加密的密碼,發(fā)送給對(duì)方
- 3、對(duì)方收到后使用自己的私鑰解密,拿到對(duì)稱加密算法的密碼,再使用密碼解密整個(gè)數(shù)據(jù)。
身份驗(yàn)證機(jī)制的實(shí)現(xiàn):發(fā)送方使用自己的私鑰加密數(shù)據(jù)后,接收方拿對(duì)方發(fā)布的公鑰解密其數(shù)據(jù),這個(gè)過(guò)程被稱之為身份驗(yàn)證
密鑰交換機(jī)制的實(shí)現(xiàn): 發(fā)送方使用對(duì)方的公鑰加密其密碼,接收方使用自己的私鑰解密后可以得到其密碼,這個(gè)過(guò)程被稱之為密鑰交換
-
常見(jiàn)算法
- RSA : 能同時(shí)實(shí)現(xiàn)加密解密
- DSS : Digital signarure standard
- DSA : 只能實(shí)現(xiàn)簽名,不能實(shí)現(xiàn)加解密
3、單向加密
-
特性:
- 1、定長(zhǎng)輸出
- 2、雪崩效應(yīng)
- 3、只加密不能解密
-
用途:
- 實(shí)現(xiàn)數(shù)據(jù)的完整性驗(yàn)證
-
常見(jiàn)算法:
- MD5 : message digest5,固定128位的定長(zhǎng)輸出
- sha1 : secure hash algorithm ,固定160位的定長(zhǎng)輸出
- sha224,sha256,sha384,sha512
密鑰交換機(jī)制(IKE ,Internet Key Exchange)
-
實(shí)現(xiàn)算法:
- RSA
- ECDH(隨圓曲線DH)
- ECDHE(臨時(shí)隨圓曲線DH)
- 公鑰加密
- DH(deffie-hellman)
-
DH交換密鑰的實(shí)現(xiàn)原理
A: p,g (生成兩個(gè)大數(shù)) B: p,g(生成兩個(gè)大數(shù)) A: x(生成一個(gè)隨機(jī)數(shù)) --> p^x%g ---->(發(fā)送給B) B: y(生成一個(gè)隨機(jī)數(shù)) -->p^y%g ----> (發(fā)送給A) A:(p^y%g)^x == p^yx%g B: (p^x%g) ^y == p^xy%g(算得的密碼都一樣)
為什么會(huì)有CA機(jī)構(gòu)的出現(xiàn)
由于基于公鑰和私鑰機(jī)制進(jìn)行密鑰交換時(shí),會(huì)有中間人攻擊的情況發(fā)生。故我們需要有一個(gè)第三方機(jī)構(gòu)幫忙認(rèn)證證書(shū)的真實(shí)性,不會(huì)被第三方利用。這個(gè)情況下,出現(xiàn)了簽證機(jī)構(gòu),即CA。
CA頒發(fā)證書(shū)的機(jī)制
- 1、客戶生成相應(yīng)的私鑰,并提取公鑰
- 2、向CA機(jī)構(gòu)發(fā)送申請(qǐng)信息,其中需要提供主體名稱、主體公鑰、主體的唯一標(biāo)識(shí),生成一個(gè)簽署請(qǐng)求文件。
- 3、CA機(jī)構(gòu)對(duì)其提供的請(qǐng)求文件提取特征碼,使用自己的私鑰對(duì)特征碼簽名,生成證書(shū)(證書(shū)中包含信息請(qǐng)見(jiàn)以下)
PKI(Public infrastructure,公鑰基礎(chǔ)設(shè)施)
-
四個(gè)組件組成
- 簽證機(jī)構(gòu) : CA
- 注冊(cè)機(jī)構(gòu) : RA
- 證書(shū)吊銷列表 : CRL
- 證書(shū)存取庫(kù) : CB
-
證書(shū)的基本格式(X.509標(biāo)準(zhǔn))
- 1、證書(shū)序列號(hào)
- 2、序列號(hào)
- 3、簽名算法ID
- 4、發(fā)行者名稱
- 5、有效期限
- 6、主體名稱
- 7、主體公鑰
- 8、發(fā)行者的唯一標(biāo)識(shí)
- 9、主體的唯一標(biāo)識(shí)
- 10、擴(kuò)展
- 11、發(fā)行者的簽名
加密通信的實(shí)現(xiàn)協(xié)議
-
SSL (Secure socket layer)
由網(wǎng)景公司研發(fā),SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層:SSL記錄協(xié)議(SSL Record Protocol):它建立在可選的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。SSL握手協(xié)議(SSL Handshake Protocol),它建立在SSL記錄協(xié)議之上, 用于在實(shí)際的數(shù)據(jù)傳輸之前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等
* ######協(xié)議版本
* V1.0
* V1.2
* V3.0
-
TLS (Transport layer security)
TLS是開(kāi)源SSL的實(shí)現(xiàn),由IETF公司于1999年發(fā)布,其支持多種算法。TLS彩分層設(shè)計(jì):
* 最底層:基礎(chǔ)算法原語(yǔ)的實(shí)現(xiàn),AES,RSA,MD5
* 向上一層: 各種算法的實(shí)現(xiàn)
* 再向上一層: 組合算法實(shí)現(xiàn)的半成品
* 再向上:用于各種組件拼裝而成的各種成品密碼學(xué)協(xié)議軟件
* 協(xié)議版本:
* V1.0
* V1.1
* V1.2(目前主流版本)
* V1.3
Handshake握手過(guò)程(無(wú)需驗(yàn)證客戶端證書(shū))
| 動(dòng)作 | 發(fā)送方 |
|---|---|
| Client hello | Client |
| (2)Server Hello | Server |
| (3)Certificate | Server |
| (4)Server hello done | Server |
| (5)Client Key Exchange | Client |
| (6)Change cipher spec | Client |
| (7)Finished | Client |
| (8)Change cipher spec | Server |
| (9)Finished | Server |
- 1、TLS客戶端通過(guò)Client Hello消息發(fā)送所支持的TLS版本、加密算法、壓縮算法、密鑰交換算法、MAC算法等信息發(fā)送給TLS服務(wù)端
- 2、TLS服務(wù)端確認(rèn)本次通信采用TLS版本加密通信,并通過(guò)Server Hello消息通知SSL客戶端,并將自己的公鑰信息的數(shù)字證書(shū)發(fā)送給TLS客戶端
- 3、服務(wù)端發(fā)送Server hello Done消息,通知客戶端版本和加密套件協(xié)商結(jié)束,開(kāi)媽進(jìn)行密鑰交換
- 4、客戶端驗(yàn)證服務(wù)端的證書(shū)合法性后,利用證書(shū)中的公鑰加密客戶端隨機(jī)生成的premaster secret(隨機(jī)數(shù)字做為密碼),發(fā)送給服務(wù)端
- 5、客戶端發(fā)送Change cipher spec消息,通知服務(wù)端后續(xù)采用協(xié)議商好密鑰和加密方法進(jìn)行加密和MAC計(jì)算
- 6、客戶端計(jì)算已交互的所有握手信息(除Change cipher spec消息)進(jìn)行Hash值計(jì)算,并使用協(xié)商好的密鑰進(jìn)行加密Hash值,并通過(guò)Finished消息發(fā)送給服務(wù)器,服務(wù)端利用同樣的方法計(jì)算已交互的握手消息的Hash值,并與解密的Hash值比較,如果二者相同,則證明密鑰和加密套件協(xié)商成功
- 7、同樣服務(wù)端也會(huì)發(fā)送Change cipher spec消息,通知客戶端后續(xù)報(bào)文采用協(xié)商好的密碼和加密套件處理Hash值,客戶端利用同樣的方法計(jì)算已交互的握手消息的Hash值,并與之對(duì)比,如果相同則證明密鑰和套件協(xié)商成功
Handshake握手過(guò)程(驗(yàn)證客戶端的證書(shū)過(guò)程)
| 動(dòng)作 | 發(fā)送方 |
|---|---|
| Client hello | Client |
| (2)Server Hello | Server |
| (3)Certificate | Server |
| (4)Certificate Request | Server |
| (5)Server hello done | Server |
| (6)Certificate | Client |
| (7)Client Key Exchange | Client |
| (8)Certificate Verify | Client |
| (9)Change cipher spec | Client |
| (10)Finished | Client |
| (11)Change cipher spec | Server |
| (12)Finished | Server |
客戶端的身份驗(yàn)證是可選的, 由服務(wù)器決定是否驗(yàn)證客戶端的身份(銀行網(wǎng)銀類似是需要驗(yàn)證客戶端的身份)
- 1、服務(wù)器發(fā)送Certficate Requset消息,請(qǐng)求客戶端的證書(shū)
- 2、客戶端通過(guò)Certificate消息將攜帶自己的證書(shū)發(fā)送給服務(wù)端
- 3、服務(wù)端驗(yàn)證該證書(shū)的合法性
- 4、客戶端計(jì)算已交互的握手信息、主密鑰的hash值,利用自己的私鑰對(duì)其進(jìn)行加密,發(fā)送給服務(wù)端
- 5、服務(wù)端計(jì)算已交互的握手信息,主密鑰的hash值,利用客戶端的公鑰解密后,進(jìn)行hash值對(duì)比,如果相同則客戶端身份驗(yàn)證成功
說(shuō)明:change cipher spec消息屬于SSL密碼變化協(xié)議,其他握手過(guò)程交互的消息均屬于SSL握手協(xié)議,統(tǒng)稱為SSL握手消息。計(jì)算Hash值,指的是利用Hash算法(MD5或SHA)將任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為固定長(zhǎng)度的數(shù)據(jù)
OpenSSL開(kāi)源軟件
1、簡(jiǎn)介
Openssl是開(kāi)源軟件,各應(yīng)用程序可以使用openssl進(jìn)行安全通訊,避免竊聽(tīng)、同時(shí)確認(rèn)另一端連線者的身份,openssl被廣泛應(yīng)用在網(wǎng)頁(yè)服務(wù)器之上。其是C語(yǔ)言所寫(xiě),實(shí)現(xiàn)了基本的加密功能,也是SSL/TLS協(xié)議的應(yīng)用實(shí)現(xiàn)。此軟件是以Eric Young以及Tim Hudson兩人所寫(xiě)的SSLeay的分支,于1998年12月發(fā)布第一個(gè)版本
2、Openssl的版本
- V0.91c (1998年12月發(fā)布)
- V1.0.1 : 支持TLS v1.2(2012年3月發(fā)布)
- V1.0.2 (2015年1月發(fā)布)
3、OpenSSL的組成部分:
- 加密解密庫(kù):Libencrypt,主要開(kāi)發(fā)者使用
- Libssl : 實(shí)現(xiàn)SSL安全通信機(jī)制的庫(kù)
- OpenSSL工具:多用途命令行工具
openssl加密工具
對(duì)稱加密工具:openssl enc
加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher
-
解密 :openssl enc -d -des3 -a -salt -out fstab -in fstab.cipher
-e : 加密 -d : 解密 -a : 以base64編碼進(jìn)行輸出 -salt : 加鹽 -in :指定從那個(gè)文件讀入 -out : 輸出至那個(gè)文件
單向加密工具:openssl dgst
-
openssl dgst -md5 fstab
-md5 :指定算法
生成用戶密碼:openssl passwd
-
openssl passwd -1 -salt 12345678
-1 : 指定加密算法 -salt : 加鹽,并且為123456
生成隨機(jī)數(shù):openssl rand
- openssl rand -base64 10 (base64編碼格式)
- openssl rand -hex 10 (16進(jìn)制編碼格式)
- openssl passwd -1 -salt $(openssl rand -hex 4)
生成私鑰:openssl genrsa
- openssl genrsa 1024 > /tmp/mykey.private
- openssl genrsa 1024 -out /tmp/mykey.private 1024
- (umask 077;openssl genrsa -out /tmp/mykey.private 1024)
提取公鑰:openssl rsa
- openssl rsa -in /PATH/FROM/private.key -pubout
- openssl rsa -in /PATH/FROM/private.key -pubout -out pub.key
查看證書(shū):opensll x509
- openssl x509 -in httpd.crt -noout -serial -subject :只查看序列號(hào)和subject
Openssl CA的工作目錄
- /etc/pki/CA
Openssl配置文件
- /etc/pki/tls/openssl.cnf
- $dir/certs : 簽發(fā)的證書(shū)存放位置
- $dir/crl : 吊銷的證書(shū)存放位置
- $dir/index.txt : 證書(shū)的索引信息
- $dir/serial : 索引序列號(hào)
- $dir/private/cakey.pem : CA自己的私鑰
- $dir/cacert.pem : CA公鑰位置
- [req] : 此ID中定義了簽署證書(shū)的屬性
構(gòu)建CA及簽發(fā)證書(shū)的步驟
########自建CA########
1、生成私鑰
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2、生成自簽證書(shū)
openssl req -x509 -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
3、為CA提供所需的目錄及文件
mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
4、建立證書(shū)索引序列號(hào)
echo 01 > /etc/pki/CA/serial
########客戶端生成私鑰及生成簽發(fā)證書(shū)請(qǐng)求########
1、到客戶端相應(yīng)的目錄中,生成私鑰
mkdir /etc/httpd/ssl
(umask 077; openssl genrsa -out httpd.key 2048)
2、生成簽署請(qǐng)求文件(實(shí)為導(dǎo)出公鑰信息)
openssl req -new -key httpd.key -out httpd.csr -days 365
########服務(wù)器端簽署證書(shū)########
1、openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
#######拷貝簽署的文件至客戶端指定目錄#######
1、cp /tmp/httpd/csr /etc/httpd/ssl
CA吊銷證書(shū)
1、客戶端獲取要吊銷證書(shū)的serial
2、CA端主機(jī)執(zhí)行吊銷操作
openssl ca -revoke /etc/pki/CA/newcert/SERIAL_ID(證書(shū)的真正序列號(hào))
3、生成吊銷證書(shū)的吊銷編號(hào)(只是第一次吊銷證書(shū)時(shí)執(zhí)行)
echo 01 > /etc/pki/CA/crlnumber
4、更新證書(shū)吊銷列表
openssl ca -gencrl -out thisca.crl
#####查看crl文件
openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text