ssl建立握手連線目的:
1.身份的驗證,client與server確認對方是它相連線的,而不是第三方冒充的,通過證書實現
2.client與server交換session key,用於連線後資料的傳輸加密和hash校驗
簡單的ssl握手連線過程(僅server端交換證書給client):
1.client傳送clienthello,指定版本,隨機數(rn),所有支援的密碼套件(ciphersuites)
2.server回應serverhello,指定版本,rn,選擇ciphersuites,會話id(session id)
3.server傳送certificate:伺服器將數字證書和到根ca整個鏈發給客戶端,使客戶端能用伺服器證書中的伺服器公鑰認證伺服器
4.server傳送serverhellodone
5.client傳送clientkeyexchange,用於與server交換session key
6.client傳送changecipherspec,指示server從現在開始傳送的訊息都是加密過的
7.client傳送finishd,包含了前面所有握手訊息的hash,可以讓server驗證握手過程是否被第三方篡改
8.server傳送changecipherspec,指示client從現在開始傳送的訊息都是加密過的
9.server傳送finishd,包含了前面所有握手訊息的hash,可以讓client驗證握手過程是否被第三方篡改,並且證明自己是certificate金鑰的擁有者,即證明自己的身份
下面從抓包資料來具體分析這一過程並說明各部分資料的作用以及如實現前面列出的握手的目標,當然了,最重要的還是說明為何這一過程是安全可靠的,第三方無法截獲,篡改或者假冒
1.client傳送clienthello
每一條訊息都會包含有contenttype,version,handshaketype等資訊。
hexdec
type
0x14
20changecipherspec
0x15
21alert
0x16
22handshake
0x17
23version是tls的版本,見下表
major version
minor version
version type30
sslv331
tls 1.032
tls 1.133
tls 1.2
handshake type是在handshanke階段中的具體哪一步,見下表
code
description
0hellorequest
1clienthello
2serverhello
11certificate
12serverkeyexchange
13certificaterequest
14serverhellodone
15certificateverify
16clientkeyexchange
20finished
clienthello附帶的資料隨機資料rn,會在生成session key時使用,cipher suite列出了client支援的所有加密演算法組合,可以看出每一組包含3種演算法,乙個是非對稱演算法,如rsa,乙個是對稱演算法如des,3des,rc4等,乙個是hash演算法,如md5,sha等,server會從這些演算法組合中選取一組,作為本次ssl連線中使用。
2.server回應serverhello
這裡多了個session id,如果ssl連線斷開,再次連線時,可以使用該屬性重新建立連線,在雙方都有快取的情況下可以省略握手的步驟。
server端也會生成隨機的rn,用於生成session key使用
server會從client傳送的cipher suite列表中跳出乙個,這裡挑選的是rsa+rc4+md5
這次server共傳送的3個handshake 訊息:serverhello,certificate和serverhellodone,共用乙個contenttype:handshake
3.server傳送certificate
server的證書資訊,只包含public key,server將該public key對應的private key儲存好,用於證明server是該證書的實際擁有者,那麼如何驗證呢?原理很簡單:client隨機生成一串數,用server這裡的public key加密(顯然是rsa演算法),發給server,server用private key解密後返回給client,client與原文比較,如果一致,則說明server擁有private key,也就說明與client通訊的正是證書的擁有者,因為public key加密的資料,只有private key才能解密,目前的技術還沒發破解。利用這個原理,也能實現session key的交換,加密前的那串隨機數就可用作session key,因為除了client和server,沒有第三方能獲得該資料了。原理很簡單,實際使用時會複雜很多,資料經過多次hash,偽隨機等的運算,前面提到的client和server端得rn都會參與計算。
4.server傳送serverhellodone
5.client傳送clientkeyexchange
client拿到server的certificate後,就可以開始利用certificate裡的public key進行session key的交換了。從圖中可以看出,client傳送的是130位元組的位元組流,顯然是加過密的。client隨機生成48位元組的pre-master secret,padding後用public key加密就得到這130位元組的資料傳送給server,server解密也能得到pre-master secret。雙方使用pre-master secret, "master secret"常量位元組流,前期交換的server端rn和client的rn作為引數,使用乙個偽隨機函式prf,其實就是hash之後再hash,最後得到48位元組的master secret。master secret再與"key expansion"常量,雙方rn經過偽隨機函式運算得到key_block,prf偽隨機函式可以可以彷彿迴圈輸出資料,因此我們想得到多少位元組都可以,就如random偽隨機函式,給它乙個種子,後續用hash計算能得到無數個隨機數,如果每次種子相同,得到的序列是一樣的,但是這裡的輸入時48位元組的master secret,2個28位元組的rn和乙個字串常量,碰撞的可能性是很小的。得到key block後,演算法,就從中取出session key,iv(對稱演算法中使用的初始化向量)等。client和server使用的session key是不一樣的,但只要雙方都知道對方使用的是什麼就行了。這裡會取出4個:client/server加密正文的key,client/server計算handshake資料hash的key。
6.client傳送changecipherspec
client指示server從現在開始傳送的訊息都是加密過的
7.client傳送finished
client傳送的加密資料,這個訊息非常關鍵,一是能證明握手資料沒有被篡改過,二也能證明自己確實是金鑰的擁有者(這裡是單邊驗證,只有server有certificate,server傳送的finished能證明自己含有private key,原理是一樣的)。client將之前傳送的所有握手訊息存入handshake messages快取,進行md5和sha-1兩種hash運算,再與前面的master secret和一串常量"client finished"進行prf偽隨機運算得到12位元組的verify data,還要經過改進的md5計算得到加密資訊。為什麼能證明上述兩點呢,前面說了只有金鑰的擁有者才能解密得到pre-master key,master key,最後得到key block後,進行hash運算得到的結果才與傳送方的一致。
8.server傳送changecipherspec
server指示client從現在開始傳送的訊息都是加密過的
9.server傳送finishd
redis的各個資料結構常用功能
redis的各個資料結構常用功能 結構型別 常用命令 使用場景 string set get mset mget incr 快取 計數器 session 限速 發短息間隔 list rpush lpop lrange lindex 訊息佇列 brpop可實現阻塞佇列 文章列表 hash hset h...
網路資料報傳送的過程和DNS過程
在整個資料報傳輸過程當中,傳送 傳送端程序首先呼叫系統呼叫,然後把資料傳送給了socket,然後socket檢查資料型別,呼叫系統呼叫send函式,send函式檢查socket的狀態,協議型別,傳給了傳輸層,傳輸層對應的協議 udp或者是tcp為這些資料建立資料結構 然後加入對應的傳輸層協議頭部,然...
sql執行各個資料庫的儲存過程
對不同的資料庫進行同一操作 if exists select name from sysobjects where name up updatedatabase drop proc up updatedatabase gocreate proc up updatedatabase sql varch...