golang https server分析

https:golang

HTTPS是http安全版本的實現,在http與tcp之間加了一層ssl/tls安全傳輸協議算法

爲了防止請求被監聽、篡改、冒充,在tls實現過程當中引入了數字證書機制,數字證書由第三方權威機構提供保證。安全

數字證書原理是採用非對稱加密生成一對公鑰、私鑰,服務端保存私鑰,下發公鑰給客戶端,因爲非對稱加密計算量比較大,服務器

因此https通訊過程當中,經過客戶端與服務端的握手交互產生三次隨機碼,從而生成一個相對安全的對稱加密密碼,密碼經過非對稱加密下發給客戶端,從而完成加密通訊dom

https本質上仍是tcp通訊,因此https的捂手是在創建tcp鏈接後,進行的一系列校驗而已,tcp

在處理tcp conn鏈接的過程當中,會判斷鏈接類型是否是tls類型,若是是會進入tlsConn.serverHandshake()握手過程。詳細流程以下:ui

下面分析一下golang中如何實現的https握手加密

在創建tlsConn鏈接後,服務端新起一個goroutine處理,server

1. config.serverInitOnce.Do(config.serverInit) // 產生一個隨機數做爲通訊憑證,下次通訊時憑證校驗經過後直接通訊,校驗不經過從新創建鏈接
2. msg, err := c.readHandshake() // 解析clientHello信息,此時獲取到由客戶端生成的第一個隨機數blog

3. c.vers, ok = config.mutualVersion(hs.clientHello.vers) // 檢查客戶端與服務端tls版本是否一致

4. _, err = io.ReadFull(config.rand(), hs.hello.random) // 服務端產生第二個隨機數
5. hs.setCipherSuite(id, supportedList, c.vers) // 確認加密算法
6. 設置服務器證書

hs.cert, err = config.getCertificate(&ClientHelloInfo{
CipherSuites: hs.clientHello.cipherSuites,
ServerName: hs.clientHello.serverName,
SupportedCurves: hs.clientHello.supportedCurves,
SupportedPoints: hs.clientHello.supportedPoints,
});

7. skx, err := keyAgreement.generateServerKeyExchange(config, hs.cert, hs.clientHello, hs.hello) // 生成服務端摘要信息8. c.writeRecord(recordTypeHandshake, helloDone.marshal()) //發送helloDone信息9. preMasterSecret, err := keyAgreement.processClientKeyExchange(config, hs.cert, ckx, c.vers) // 處理獲取由客戶端生成的第三個隨機數10. hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random) // 生成通訊祕鑰11. hs.finishedHash.Write() // 服務端發送最後一次確認請求

相關文章
相關標籤/搜索