安全通信TLS介紹

理論基礎

現在我們每天都離不開網絡,計算機之間的通信安全是怎麼保證的。在這篇文章中,將介紹TLS技術是怎麼爲安全的通信保駕護航的。

爲了能夠使理論知識更夠通俗易懂,在此,設計一個場景。小明和小花早戀,他們常通過鴻雁傳書進行書信往來。

最初,小明將寫好的書信通過信鴿傳給小花,常常會發生信件被雙方拆看的情況,年輕總是羞羞噠的,爲了改變這種局面,小明想了一個辦法,既然傳明文不安全,那就加密唄,這個還顯得有些小浪漫。這時引出了本文的第一個知識點,對稱加密。原理很簡單,用公式表示:

小明 `: C = E(M, K)`

小花 `: M = D(C, K)`

小明每次通信前先通過信鴿將密鑰通過信鴿傳給小花,然後再傳信內容,通過該機制,交流了一段時間,發現通信內容還是會泄露。也就是說,這種機制也存在不安全的性。有問題就要解決,小明從書裏知道了現在有一種新的加密技術,非對稱加密技術。生成一組密碼對,公鑰key1和私鑰key2.私鑰加密過的內容只能用公鑰來解密。用公式表示:

`小明` `: C = E(M, K1)`

`小花` `: M = D(C, K2)`

採用了該加密機制後,有一天,小明收到小花的分手信,這個讓小明頹廢了好久,二人的關係變得很緊張,最後才知道,是一個小王的傢伙也喜歡小花,通信內容被他截獲了,僞造小花的信件。這種方式也存在巨大的不安全性。這個最大的問題,就是對公鑰的信息無法身份認證。

那麼對傳送的公鑰做數字簽名形成證書,然後驗證該證書中的簽名信息

機制流程:

  1. 小花把自己的公鑰和域名做爲身份證申請(certificate signing request,CSR)
  2. 小花把CSR發給一個德高望重的人(被稱爲 certificate authority,CA),比如小亮,
  3. 小亮用自己的私鑰加密小紅的 CSR,得到的密文被稱爲數字簽名(digital signature)
  4. 小亮把 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, 集羣系統中都有着它的身影,它提供了一種安全的傳輸方式。有的只驗證一方,有的需要做雙方驗證。在做系統間通信時,爲了保證通信的安全性,這種機制在系用設計不可卻少。

自建https證書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章