其實在最開始抓包的時候就發(fā)現(xiàn)了一個問題琼开,就是在ChangeCipherSpec消息之后易结,沒有加密擴展、證書柜候,甚至Finished消息都沒有衬衬。在握手過程中,F(xiàn)inished消息是一定存在的改橘,所以說明用Wireshark抓的包存在問題滋尉,之前提到過,ChangeCipherSpec之后的消息都是進行加密了的飞主,所以可能是因為Wireshark沒有對后續(xù)的消息進行解密狮惜,所以只是顯示了ApplicationData,即加密傳輸?shù)臄?shù)據(jù)碌识。
那么要想利用wireshark對其進行分析碾篡,就要想辦法得到密鑰,對加密的消息進行解密筏餐,這里的解決方法參照https://jingyan.baidu.com/article/20b68a88b2af7f796cec62b3.html开泽。
簡要步驟:
1.創(chuàng)建一個log文件,因為Firefox和Chrome瀏覽器都支持用log文件的方式記錄下用來加密TLS數(shù)據(jù)包對稱會話秘鑰的魁瞪,所以創(chuàng)建ssl.log來保存會話密鑰穆律。
2.配置環(huán)境變量惠呼。右鍵點擊我的電腦->屬性->高級系統(tǒng)設置->高級->環(huán)境變量->系統(tǒng)變量
然后新建一個系統(tǒng)環(huán)境變量,變量名是SSLKEYLOGFILE峦耘,變量值就是你的log文件的位置剔蹋。
3.在Wireshark中進行配置。編輯->首選項->協(xié)議Protocols->SSL辅髓,在(pre)-Master-Secret log filename一欄中添加剛才的log文件位置泣崩。
然后再進行抓包,抓包結(jié)果如圖:
可以看到之前的
Application Data
被解析為EncryptedExtentions洛口、Certificate矫付、Certificate verrify、Finished
第焰,下面將對這幾個消息進行逐個分析买优。Encrypted Extentions加密擴展
加密擴展中包含兩個擴展內(nèi)容——
supported_groups
和server_name
。Type
樟遣、Length
依舊表示類型和長度,不再進行單獨解釋身笤。supported_groups
包含的是服務器所支持的曲線組豹悬,這里有x25519、secp256r1液荸、secp384r1瞻佛。server_name
表示服務器名,此處加密擴展是服務器發(fā)給客戶端的娇钱,所以置為空伤柄。
Certificate
Certificate Request Context Length
,在此處置為空文搂,即長度為0适刀。Certificate Request
一般是在加密擴展消息之后服務器(可選)進行發(fā)送的,服務器用它來請求客戶端發(fā)送證書煤蹭,如果服務器發(fā)送了Certificate Request笔喉,客戶端一般需要在后面發(fā)送自己的Certificate,并在Certificate消息中包含Certificate Request Context來進行響應硝皂;所以服務器發(fā)送的證書中常挚,Certificate Request Context為空,長度為0稽物。Certificates
奄毡,證書(CertificateEntry)序列,每個CertificateEntry包含一個證書和一組擴展贝或。
signedCertificate
:
version
吼过,版本為v3锐秦;serialNumber
,序列號那先。
signature
: Algorithm Id
农猬,簽名算法ID,這里表示sha256WithRSAEncryption售淡。
issuer
斤葱,證書頒發(fā)者,用X.509 DN
表示揖闸,DN是由RDN構(gòu)成的序列揍堕,RDN用“屬性類型=屬性值”的形式表示。
CountryName
汤纸,國家衩茸,此處為US。
OrganizationName
贮泞,機構(gòu)名楞慈,此處為Let's Encrypted。
commonName
啃擦,通用名稱囊蓝,此處為Let's Encrypted Authority X3。
validity
令蛉,表示證書的合法性聚霜,包含證書有效期的起止時間。subject
珠叔,證書的主體蝎宇,也用X.509 DN
表示,即RDN序列祷安。commonName
姥芥,通用名稱,此處為tls13.crypto.mozilla.org汇鞭,即所頒發(fā)證書的對象撇眯。 subjectPublicKeyInfo
,證書主體公鑰信息虱咧。Algorithm
熊榛,公鑰算法,這里用的是RSA腕巡。subjectPublicKey
包含的就是具體的公鑰玄坦,包括modulus
(系數(shù))和Exponent
(指數(shù))。extentions
,擴展煎楣,這里有9個擴展豺总,分別是keyUsage
、extKeyUsage
择懂、basicConstraints
喻喳、subjectKeyIdentifier
、authorityKeyIdentifier
困曙、authorityInfoAccessSyntax
表伦、subjectAltName
、certificatePolicies
慷丽、SignedCertificateTimestampList
蹦哼。keyUsage
,表示證書的公鑰可以完成的功能或服務要糊,這里包含digitalSignature和keyEncipherment纲熏。extKeyUsage
碎乃,表示Extended Key Usage,包含一系列的KeyPurposeID路操,每一個都表示一種用途,這里包括serverAuth和clientAuth屈藐。basicConstraints
奶赠,基本約束擴展鱼填,subjectKeyIdentifier
车柠,主體密鑰標識符剔氏,用來識別包含特定密鑰的證書塑猖。authorityKeyIdentifier
竹祷,**密鑰標識符,用來識別證書所用私鑰對應的公鑰羊苟。authorityInfoAccessSyntax
塑陵,序列中的每個條目都描述了擴展所在的證書的頒發(fā)者提供的附加信息的格式和位置。信息的類型和格式由accessMethod字段指定;accessLocation字段指定信息的位置蜡励。subjectAltName
令花,表示Subject Alternative Name,主體可選名凉倚,可使身份與證書主體綁定兼都,此處只給出了一個GeneralName。certificatePolicies
稽寒,證書策略擴展包含一個或多個策略信息術語的序列扮碧,每個術語由對象標識符(object identifier,OID)和可選限定符(optional qualifiers)組成。SignedCertificateTimestampList
,表示證書時間戳序列,包含時間戳(Timestamp)慎王、簽名算法(Signature Algorithm)蚓土、簽名(Signature)以及其他字段。從
signature
到剛才的extensions
都是signedCertificate
中的內(nèi)容赖淤。
algorithmIdentifier
蜀漆,表示算法標識符,包含Algorithm ID咱旱,對應于特定算法确丢,此處為sha256WithRSA。Padding
莽龟,填充內(nèi)容蠕嫁,此處為空。
另外一個證書的內(nèi)容和上述內(nèi)容類似毯盈,不再進行詳細敘述剃毒,因為證書的內(nèi)容不是研究的重點,所以敘述比較簡單搂赋,具體看rfc5280對X.509證書的定義https://tools.ietf.org/html/rfc5280#section-4.1.2.9赘阀。
Certificate Verify
Signature Algorithm
,簽名算法脑奠,此處為rsa_pss_rsae_sha256基公。Signature
,簽名內(nèi)容宋欺。
Finished
Finished
消息是身份驗證階段的最后一條消息轰豆,Verify Data
是通過HMAC計算得來的,包含finished_key和握手消息的hash齿诞。
verify_data =HMAC(finished_key,Transcript-Hash(Handshake Context,Certificate, CertificateVerify))