Engineering · 1 min read
TLS 基礎,以及為什麼有三個憑證檔
TLS 做兩件事:加密與身分。身分需要三個檔案,不是一個。root_ca 驗別人、certificate 加 private_key 證明自己,這篇拆解這個分工。
先講名詞。TLS(舊名 SSL)是替一條網路連線加上安全性的協定。它做兩件互相獨立的事,分開記會清楚很多:
- 加密:兩端在一段很短的「握手」過程裡談好一把共用的秘密金鑰,再用它把流量打亂,讓中間的人看不懂。
- 身分:每一端都能用一張憑證證明自己是誰。憑證是一份數位身分文件,由一個大家都信任的簽發機構(CA,憑證頒發機構)簽名背書。
握手講白話大概是:客戶端打招呼,伺服器送出自己的憑證,客戶端確認這張憑證是由它信任的 CA 簽的,兩端各自推導出同一把秘密金鑰(全程不必把金鑰送出去),然後才開始傳真正的、加密過的資料。
真正讓人卡住的是:身分需要三個檔案,不是一個。它們長得很像,其實各司其職:
| 檔案 | 是什麼 | 是機密? |
|---|---|---|
root_ca.pem | 信任錨點:用來驗證對方那張憑證是不是真的 | 否 |
certificate.pem | 你自己的公開身分,由 CA 簽發 | 否 |
private_key.pem | 對應的私鑰,證明這身分真的是你的(絕不送出) | 是 |
一句話記法:驗證對方用 root_ca,證明自己用 certificate 加 private_key。(.pem 只是存放這些東西的一種常見文字格式。)
這次遷移裡: 部署會把這三個檔案放到 pixel-service 旁邊,讓它能對 9093 埠的 Kafka 伺服器講 TLS。private_key.pem 一旦外洩,等於把你的身分交出去,所以驗證腳本跑完會把它刪掉。
root_ca驗別人,certificate加private_key證明自己。角色搞混就什麼都連不上。
參考來源
- https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/
- https://www.ssl.com/article/ssl-tls-handshake-ensuring-secure-online-interactions/
- https://www.youtube.com/watch?v=Kw2P1RR-3k8
延伸閱讀: 這三個檔案正是讓 Kafka 客戶端的 SSL 設定能運作的東西;至於出示一張憑證還是兩張,差別在單向 vs 雙向 TLS。回到總覽:一張遷移單背後的兩個 SSL。