安全傳輸層協定 TLS,以前稱為 SSL(Secure Sockets Layer) ,由于HTTPS的推出受到了很多人的歡迎。但是正如TLS的名稱 Transport Layer Security 所示的那樣,它實際上是獨立于 HTTP,一個更深入的安全協定,我們可以将 TLS 視為 TCP 的安全版本,其提供了對 socket 通信進行加密和簽名的功能。在我們的日常開發中,會将 gRPC 協定運作在TLS之上以確定安全。

今天我們來了解一下如何建立一個通過 TLS 加密的 socket 服務。
服務端示例
這個服務端程式接受來自多個用戶端并發請求,并向用戶端發送的所有的鏡像資料。和非TLS服務相比,這裡用 tls.Listen 替換了 net.Listen,同時需要提供一個可用的 tls.Config,我們可以使用 mkcert 指令來生成證書和密鑰對檔案。
用戶端示例:
和非 TLS 用戶端相比,我們同樣也隻是把 net.Dial 換成 tls.Dial, tls.Config 中填寫的證書可以選擇權威 ca 頒發的證書,也可以使用自簽名證書。
一般來說,我們将自己生成的 CSR 送出給簽名商,他們用中級證書機構的私鑰 Private Key 給我們的簽名成證書,Root CA 通過它的私鑰對中級機構送出的CSR進行簽名。
證書頒發機構是一個樹形結構的。比如在驗證我們證書X的有效性的時候,會一層層的去尋找頒發者的證書,直到自簽名的根證書,然後通過相應的公鑰再反過來驗證下一級的數字簽名的正确性。直到找到X證書,這就是證書鍊(Certificate Chains)。
我們可以使用以下程式檢查任何伺服器的證書鍊:
給定IP位址後,啟動程式後會與伺服器建立一條 TLS 連接配接,并上報其使用的證書給服務端。如果我們使用未處理過的自簽的證書,TLS 服務端驗證是通不過的。是以我們需要權威ca 頒發的證書,或者使用 <code>mkcert</code> 為我們的伺服器生成證書來使他生效。
打開終端,執行 <code>mkcert</code> 指令:
新打開一個終端,運作 tls-dial-port:
我們看到生成了證書 mkcert。由于 mkcert 将此證書添加到伺服器的系統根存儲中,直接使用 tls.Dial 将信任該證書。
(版權歸原作者所有,侵删)