Engineering · 1 min read
Kafka 客戶端的 SSL 設定,以及「缺席即明文」
Kafka 客戶端需要四個 SSL 設定,但只有在 security.protocol 有設時才補上。沒設就維持明文。一個 if,就是正式環境與筆電之間的全部差別。
應用程式要連 Kafka,會透過一個 Kafka 客戶端函式庫(Go 和 Python 的客戶端底層都是同一套核心)。要打開加密(雙向 TLS),它需要四個設定:
security.protocol=SSL
ssl.ca.location=<root_ca.pem> # 驗證 Kafka 伺服器
ssl.certificate.location=<certificate.pem> # 我的身分
ssl.key.location=<private_key.pem> # 證明這身分是我的
(還有第五個 ssl.key.password,只有在私鑰本身有設密碼時才用得到。)
真正漂亮的是它怎麼讓本機開發保持簡單。這招可以叫做缺席即明文:只有在 security.protocol 有設的時候,才補上那四個加密設定。沒設,函式庫就安靜地維持明文、忽略那些加密設定,本機那條路完全不用多加任何設定就能跑。
一個「if」,就是「正式環境加密」和「筆電上明文」的全部差別。不用另外 build,也不會因為憑證設定不在就報錯。
這次遷移裡: producer 那段程式組出客戶端設定,把那四個加密設定補在一個「如果有設 security protocol」的判斷後面,所以本機的設定檔(沒有加密、Kafka 關掉)完全不用動,剛好滿足「本機開發一開始沒有任何 SSL 設定」的要求。有個跟語言有關的小地雷:在 Go 裡那個設定物件是一個具名型別,不是普通的 map,所以測試用的 helper 得用那個型別,不然編不過。
讓「缺席」本身就是設定。「沒設協定」是一個有效、能跑的狀態,不是漏掉了什麼。
參考來源
延伸閱讀: 那四個設定指向的是三個憑證檔,而且只對加密的 9093 門有意義。回到總覽:一張遷移單背後的兩個 SSL。