一、概要
為了網(wǎng)站以及用戶的安全性,現(xiàn)在很多的網(wǎng)站都是https,大家都知道tcp通過(guò)三次握手建立連接,并且還有很多的同學(xué)對(duì)https連接建立的流程不太明白,包括我自己,通過(guò)借助于wireshark這種抓包工具,我們可以嘗試著了解一下大概的流程。
客戶端(10.0.45.103)訪問(wèn)服務(wù)端(114.215.88.85)通過(guò)wireshark抓包顯示出來(lái)的雙方交互數(shù)據(jù),訪問(wèn)是通過(guò)https訪問(wèn)服務(wù)器上的一臺(tái)nginx服務(wù)器服務(wù)。請(qǐng)關(guān)注第一列的no。下文中很多時(shí)候會(huì)用no表示一次交互。
圖中可以很明顯的看出tcp的三次握手以及之后的tls加密流程的建立。
二、tcp的三次握手
通過(guò)流程圖可以看出(也可以看圖1 的19368到19370這三個(gè)編號(hào)),首先客戶端向服務(wù)端發(fā)起一個(gè)syn的請(qǐng)求,序號(hào)(seq)為0,確認(rèn)號(hào)(ack)也為0,這代表是本次是由客戶端發(fā)起的首次請(qǐng)求。本次請(qǐng)求的數(shù)據(jù)長(zhǎng)度為0
然后服務(wù)端給客戶端響應(yīng),此時(shí)服務(wù)端的seq也是0,代表這是服務(wù)端的第一次回應(yīng),并且給客戶端說(shuō),你的請(qǐng)求我已經(jīng)收到了(ack=1),
最后返還給客戶端以后,客戶端的序號(hào) 1,并且對(duì)服務(wù)端的響應(yīng)做出確認(rèn),最后回給服務(wù)端,此時(shí)ack=1,seq=1
tcp的握手過(guò)程建立成功。
三、ssl連接的建立
通過(guò)以上可以看出,ssl也是建立在tcp的基礎(chǔ)上的,經(jīng)過(guò)tcp的三次握手,接下來(lái)才是加密信道的建立。
客戶端和服務(wù)端建立安全連接大致經(jīng)過(guò)以下幾個(gè)步驟
客戶端:clienthello 服務(wù)端:server hello,server certificate,server exchange,server hello done 客戶端:client exchange 客戶端:application data 服務(wù)端:new session 服務(wù)端:application data
接下來(lái)看這幾個(gè)步驟中具體的每一個(gè)步驟傳輸?shù)膬?nèi)容
clienthello
client首先給服務(wù)端打招呼,對(duì)服務(wù)端說(shuō)hello
應(yīng)用層沒(méi)什么特別的
客戶端向服務(wù)端發(fā)送202個(gè)字節(jié)的數(shù)據(jù),并且客戶端此時(shí)的 seq num 為1 ,tcp三次握手已經(jīng)通過(guò)了,所以客戶端ack num 確認(rèn)的是服務(wù)端的tcp的最后一次信息。由于這次發(fā)送的長(zhǎng)度是202個(gè)字節(jié),所以給服務(wù)端說(shuō),下一個(gè)字節(jié)序列號(hào)是從203開(kāi)始的。
標(biāo)志位為ack和psh
但是這次多了一個(gè) secure socket layer層。協(xié)議使用的時(shí)候,用的是handshake protocol,給服務(wù)端發(fā)消息clienthello
詳細(xì)的信息如下:
secure socekts layer層使用的是版本是tls 1.0
handshake type的類型,是客戶端打招呼 client hello
handshake protocol 協(xié)議使用的是tls 1.2
發(fā)送的信息還有客戶端在本地生成的隨機(jī)碼(random)
然后客戶端聲明自己所支持的加密套件(cipher suites)這個(gè)客戶端支持15種加密套件
加密套件中表明了使用的對(duì)稱加密算法,非對(duì)稱加密算法,摘要算法以及使用的是tls或者是ssl
還有一些其他的信息
第一行指明是否進(jìn)行了壓縮以及使用的壓縮算法,第二行null表明未進(jìn)行壓縮,以及選用相關(guān)的壓縮算法或者壓縮工具
剩下的就是一些擴(kuò)展的字段了
總結(jié)下來(lái),客戶端向服務(wù)端第一次打招呼(client hello)的時(shí)候?qū)嶋H上主要發(fā)送了以下主要的信息
客戶端的隨機(jī)數(shù)
客戶端所支持的加密套件
以及客戶端和服務(wù)器之間的sessionid
接下來(lái)就是服務(wù)端對(duì)客戶端hello的第一次回應(yīng),也就是編號(hào)19372
可以看到 服務(wù)端使用的是443端口,序列號(hào)(sequence number)也是1 ,并且回應(yīng)客戶端說(shuō)我已經(jīng)確認(rèn)收到你的202個(gè)自己的數(shù)據(jù)(203-1),flags表明本次是服務(wù)端反饋給客戶端請(qǐng)求的應(yīng)答(藍(lán)色的文字也寫(xiě)出來(lái)了,這是一個(gè)隊(duì)19371編號(hào)的應(yīng)答)
可以看出這是一個(gè)tcp連接
server hello
接下來(lái)不等客戶端反應(yīng),服務(wù)端又給客戶端發(fā)送了19373的數(shù)據(jù),而這個(gè)數(shù)據(jù)就是使用了tls1.2協(xié)議了。
摘要信息中說(shuō)明了這是服務(wù)端的的hello,server hello,服務(wù)端秘鑰交換,服務(wù)端hello done。接下來(lái)看服務(wù)端發(fā)過(guò)來(lái)的具體都有什么。
傳輸控制層(transmission control protocol)和上面一樣,主要是一些flags,端口以及數(shù)據(jù)長(zhǎng)度的確認(rèn)等等,主要看一下安全套接字層的東西(secure sockets layer)中的東西。
通過(guò)上圖,可以看出服務(wù)端主要返回四種內(nèi)容。
server hello 服務(wù)端的回應(yīng)客戶端的hello信息 certificate 服務(wù)端證書(shū) server key exchange 服務(wù)器秘鑰交換 server hello done 服務(wù)器信息發(fā)送完畢
詳細(xì)看一下各個(gè)record layer中的具體內(nèi)容
server hello
在server hello中,服務(wù)器返回的服務(wù)端的隨機(jī)數(shù),所選用的tls 版本,以及服務(wù)器最終選用的客戶端和服務(wù)端交互的加密套件(tls_ecdhe_rsa_with_aes_256_gcm_sha384 (0xc030)),最終選用的加密套件是rsa非對(duì)稱加密算法以及aes對(duì)稱加密算法,用的是sha384做摘要,注意,這個(gè)值必須是客戶端發(fā)給服務(wù)端的列表中選出來(lái)的。實(shí)際上如果客戶端只能支持版本和安全性比較低的加密套件,這樣服務(wù)端選擇和客戶端交互的時(shí)候也被迫只能使用低版本的加密套件,其安全性就會(huì)降低。除了以上這些,服務(wù)端server hello時(shí)發(fā)送回來(lái)的還有是否使用了壓縮以及一些其他的擴(kuò)展字段
certificate
server hello以后,服務(wù)端會(huì)發(fā)送公鑰證書(shū)給客戶端
certificates (953 bytes) certificate length: 950 certificate: 308203b23082029aa003020102020101300d06092a864886… (id-at-commonname=www.wtf.com,id-at-organizationname=jd,id-at-stateorprovincename=bj,id-at-countryname=cn) signedcertificate version: v3 (2) serialnumber: 1 signature (sha256withrsaencryption) algorithm id: 1.2.840.113549.1.1.11 (sha256withrsaencryption) issuer: rdnsequence (0) rdnsequence: 7 items (pkcs-9-at-emailaddress=iloveme313@163.com,id-at-commonname=wangtengfei,id-at-organizationalunitname=section,id-at-organizationname=jd,id-at-localityname=bj,id-at-stateorprovincename=bj,id-at-countryname=cn) rdnsequence item: 1 item (id-at-countryname=cn) rdnsequence item: 1 item (id-at-stateorprovincename=bj) rdnsequence item: 1 item (id-at-localityname=bj) rdnsequence item: 1 item (id-at-organizationname=jd) rdnsequence item: 1 item (id-at-organizationalunitname=section) rdnsequence item: 1 item (id-at-commonname=wangtengfei) rdnsequence item: 1 item (pkcs-9-at-emailaddress=iloveme313@163.com) validity notbefore: utctime (0) utctime: 16-11-22 06:38:18 (utc) notafter: utctime (0) utctime: 17-11-22 06:38:18 (utc) subject: rdnsequence (0) rdnsequence: 4 items (id-at-commonname=www.wtf.com,id-at-organizationname=jd,id-at-stateorprovincename=bj,id-at-countryname=cn) rdnsequence item: 1 item (id-at-countryname=cn) rdnsequence item: 1 item (id-at-stateorprovincename=bj) rdnsequence item: 1 item (id-at-or