請教SSL握手過程中,為什麼抓包找不到pre-master-key?
考慮單向認證,客戶端生成一個隨機數,抓包了看到有random欄位,伺服器生成一個隨機數,抓包也看到有random欄位;
問題是客戶端在認證完了伺服器端的證書之後,按照我查的資料,應該是會產生一個pre-master-key來產生最後的會話密鑰的,但是我抓包卻找不到,
請問各位大大這個是怎麼破!
This PreMasterSecret is encrypted using the public key of the server certificate.
要是你能抓到其明文的話,SSL就沒用了。
因為協議里常用的cipher suite除了RSA, DH_DSS,DH_RSA之外,pre-master key是雙方各自計算而不放在信道上傳遞的。例如,如果用的是TLS_DHE_XXX...,pre-master key是各自從server key Exchange, client key exchange里計算的。
RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2
RSA做密鑰協商(密鑰交換)時,是否可以防範中間人攻擊? - 演算法
pmk有2種生成模式,一種是rsa加密,既然是加密的包里肯定看不到
另一種是dh協商的,雙方各自貢獻一部分公共信息,但key只在本地產生,網上通信包里沒有因為被伺服器端的公鑰加密了,只有伺服器私鑰才能解,以下摘自我的有道雲筆記!
Authentication and Key Exchange階段
ServerHello信息發送以後,伺服器發送ServerCertificate信息和 ServerHelloDone信息。ServerCertificate信息發送伺服器證書(證書里包含伺服器公鑰)。ServerHelloDone信息是一個簡單的信息,表示伺服器已經在這個階段發送了所有的信息。Pre_master secret由兩個部分組成:客戶提供的protocol version(協議 版本)和random number(隨機數)。協議版本設計來抵禦rollback attacks(反轉攻擊)。客戶使用伺服器公鑰來加密pre_master secret。如果需要對客戶進行認證,伺服器需要發送CertificateRequest信息來請求 客戶發送自己的證書。客戶回送兩個信息:ClientCertificate和 CertificateVerify,ClientCertificate包含客戶證書,CertificateVerify用於完成客戶認證工作。它包含一個對所有handshake信息進行的hash,並且這個 hash被客戶的私鑰做了簽名。為了認證客戶,伺服器從ClientCertificat獲取客戶的公鑰,然後使用這個公鑰解密接受到的簽名,最後把解密後的結果和伺服器 對所有handshake信息計算hash的結果進行比較。如果匹配,客戶認證認證成功。
預主密鑰用伺服器公鑰加密了發送。收到後 伺服器會用單向哈希函數生產主密鑰,然後用單向哈希函數生成會話密鑰。客服端同樣的過程生成會話密鑰。
pre-master-key會攜帶在clientkeyexchange裡面,是使用server的公鑰加密的,所有你抓到了看不到,如果你的這次握手採用的密鑰交換協議只是普通的RSA而沒有用到DHE或者ECDHE這樣的完全前向加密的話,你可以使用服務端證書的對應私鑰來解密就能看到了
非對稱加密啊,用私鑰解啊
我的理解是,首先Client與Server之間後續通訊需要Session Key,而這個Session Key需要三個random欄位合併計算出,頭兩個random是Client與Server之間互發的明文random,最後一個random是Client生成後用Server給的公鑰加密再傳給Server的,所以你應該能夠抓到密文。
防監聽,
推薦閱讀:
※上經過ssl加密的網站,為什麼有的顯示公司名,有的不顯示?
※如何評價《Why I stopped using StartSSL》的評論?
※在印象筆記中可以安全的保存很私密的信息嗎?