把有道雲筆記中的筆記搬運過來golang
最近簡單學習了HTTPS,並在golang中實踐了一下,如今把學到的知識記錄下來。算法
一些簡單的概念,能夠自行百度百科chrome
客戶端和服務器通訊時兩者須要的數據:瀏覽器
客戶端和服務器通訊的流程:安全
在golang中的使用:服務器
首先咱們要有一個服務於https的服務端,經過golang的http包,很簡單的就能完成https服務端的構建學習
func main() { http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) { defer request.Body.Close() writer.Write([]byte("hello world")) }) if err := http.ListenAndServeTLS(":8080", certPath, keyPath, nil); err != nil { panic(err) } }
certPath和keyPath分別是服務端證書和服務端私鑰的路徑,在這裏我用openssl生成了一個CA根證書,用這個CA根證書籤發了服務器證書。大數據
而後我將我用openssl生成的CA根證書導入瀏覽器中並信任該CA,而後重啓chrome(不要隨便導入未知的CA根證書,這很危險)加密
而後咱們經過瀏覽器訪問https://localhost:8080/testspa
ok,已經能夠正常通訊了。
若是沒有把根證書導入到咱們的電腦中並設置信任會怎麼樣呢?下面我將根證書設爲不信任。
再次訪問https://localhost:8080/test
瀏覽器會提示你這個連接不是安全的https連接
數據摘要:將數據作hash以後獲得的就是數據摘要。經常使用的算法有md5,sha1等等。
簽名:簽名就是用私鑰對數據摘要進行加密,這個操做就叫作簽名。
簽名解決的問題:在非對稱加密中,加密公鑰是公開的,AB兩個終端創建鏈接,發送的公鑰可能會被其餘人獲取到,這我的獲取到公鑰後可能會假裝成AB其中一人向另外一我的發送加密後的請求。爲了防止有人冒充,引入了簽名的機制來驗證發送人是否合法。
簽名驗證問題:在非對稱加密中,公鑰用於數據加密,私鑰用於數據解密,私鑰也能夠用於對數據簽名,用公鑰來驗證簽名。
簽名驗證的流程:非對稱加密中,A要向B傳送密文,B要驗證接收到的數據是不是A發送的,因此A須要在向B發送密文數據時一塊兒發送一個簽名。首先將要發送的數據明文作hash,獲得數據摘要,再用私鑰加密數據摘要,生成簽名,將簽名和已加密的密文,一塊兒發送給B,B拿到密文和簽名後,用私鑰對密文進行解密,解密後得到明文,對明文作hash生成數據摘要,B將A發送來的簽名用A的公鑰進行解密,解密後得到的數據摘要和B本身生成的數據摘要作比對,若是相同就是沒有被篡改過的數據。