理論基礎
現在我們每天都離不開網絡,計算機之間的通信安全是怎麼保證的。在這篇文章中,將介紹TLS技術是怎麼爲安全的通信保駕護航的。
爲了能夠使理論知識更夠通俗易懂,在此,設計一個場景。小明和小花早戀,他們常通過鴻雁傳書進行書信往來。
最初,小明將寫好的書信通過信鴿傳給小花,常常會發生信件被雙方拆看的情況,年輕總是羞羞噠的,爲了改變這種局面,小明想了一個辦法,既然傳明文不安全,那就加密唄,這個還顯得有些小浪漫。這時引出了本文的第一個知識點,對稱加密。原理很簡單,用公式表示:
小明 `: C = E(M, K)` 小花 `: M = D(C, K)`
小明每次通信前先通過信鴿將密鑰通過信鴿傳給小花,然後再傳信內容,通過該機制,交流了一段時間,發現通信內容還是會泄露。也就是說,這種機制也存在不安全的性。有問題就要解決,小明從書裏知道了現在有一種新的加密技術,非對稱加密技術。生成一組密碼對,公鑰key1和私鑰key2.私鑰加密過的內容只能用公鑰來解密。用公式表示:
`小明` `: C = E(M, K1)` `小花` `: M = D(C, K2)`
採用了該加密機制後,有一天,小明收到小花的分手信,這個讓小明頹廢了好久,二人的關係變得很緊張,最後才知道,是一個小王的傢伙也喜歡小花,通信內容被他截獲了,僞造小花的信件。這種方式也存在巨大的不安全性。這個最大的問題,就是對公鑰的信息無法身份認證。
那麼對傳送的公鑰做數字簽名形成證書,然後驗證該證書中的簽名信息
機制流程:
- 小花把自己的公鑰和域名做爲身份證申請(certificate signing request,CSR),
- 小花把CSR發給一個德高望重的人(被稱爲 certificate authority,CA),比如小亮,
- 小亮用自己的私鑰加密小紅的 CSR,得到的密文被稱爲數字簽名(digital signature),
- 小亮把 signature 和 CSR 的明文合在一起稱爲 CA簽署的身份證(CA signed certificate,CRT),發給小紅
小花:CSR = 小花公鑰+小花域名 signature = E(CSR, 小亮的私鑰) CRT = CSR + signature
小明找小花通信時,先獲取小花通過小亮簽發的證書,小明這裏存放着小亮的公鑰,小明通過該公鑰對簽名信息進行驗證,驗證通過後,說明小紅的公鑰是信任的。
這種機制的前提是,必須要絕對的信任CA的公鑰。可見,安全是建立在信任的基礎之上。沒有了信任也就沒有了安全,我們在建立一套安全體系時,首先要考慮那些是可信的,那些是不可信的。
現在的https之所以可以能夠正常運轉,是建立在操作系統和瀏覽器對根證書信任的基礎上,它們集成了根證書的公鑰,這樣就建立起了信任鏈。
以上內容,我們建立起了整個安全通信的理論體系。接下來,我們通過openssl,進行實踐。
操作實踐
openSSL 是一個關於網絡通信安全方面的一個工具,功能比較強大
- 生成公鑰私鑰openssl genrsa -out server.key 2048
- 生成CSRopenssl req -nodes -new -key server.key -subj "/CN=localhost" -out server.csr
- 簽署身份openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt以上是一種自簽名的方式,簽名的證書和csr中的公鑰相同
測試
使用go語言編寫一個https的服務
package main import ( "io" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") }) if e := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil); e != nil { log.Fatal("ListenAndServe: ", e) } }
瀏覽器中沒有添加簽名證書的公鑰,會導致不信任,可以加公鑰加入到瀏覽器中,就可以訪問了。
curl工具訪問
$ curl --cacert server.crt https://localhost
如果沒有可以通過openssl向服務端要一個
openssl s_client -showcerts -connect localhost:443 > cacert.pem curl --cacert cacert.pem https://localhost
總結
tls不僅僅用於https,在現在的docker, 集羣系統中都有着它的身影,它提供了一種安全的傳輸方式。有的只驗證一方,有的需要做雙方驗證。在做系統間通信時,爲了保證通信的安全性,這種機制在系用設計不可卻少。