從一個 NiFi mTLS 問題搞懂 Keystore 與 Truststore
前言
今天幫同事解決了一個 NiFi 上設定 mTLS 的問題。
由於公司最近換了內部的 CA,同事在更新憑證的過程中發現使用者無法用自己的憑證登入 NiFi,起初大家都覺得是 Server 憑證的問題,直覺告訴我和 Client 應該也有關。
mTLS 是怎麼運作的
一般我們透過 SSL/TLS 連線到網站,瀏覽器只需要驗證網站的憑證就好,Mutual TLS(mTLS)則是 Server 和 Client 互相驗證,用前面的例子來說,就是網站也需要驗證使用者的憑證。
先來看 TLS 的流程:
再來看 mTLS 的流程:
在 Server 發出 Certificate Request 時,如果有合適的憑證,就會要求使用者選擇。
NiFi 的設定出了什麼問題
在 NiFi 的設定中可以透過 nifi.security.keystore 來選擇 Keystore,這邊的 Keystore 就是 NiFi Server 自己的 Private Key + 憑證的組合。
如果有設定 nifi.security.needClientAuth 為 true 的話,就會啟用 mTLS 要求 Client 提供憑證,而且需要另外設定信任的 CA nifi.security.truststore。
這次的問題就是出在我們把 Server 從舊憑證(CA1 發行)更新成新憑證(CA2)後,同時也把 nifi.security.truststore 換成只含 CA2 的版本。
這樣雖然網頁打得開,但一般使用者的憑證是由 CA1 發行的,NiFi 的 truststore 不認識 CA1,所以無法通過 mTLS 驗證。
解決方法是讓 nifi.security.truststore 同時信任 CA1 和 CA2,可以透過 keytool(Java 內建的憑證管理工具,用來對 Keystore / Truststore 做新增、刪除、列出等操作)來匯入:
1 | |
產生同時信任 CA1 和 CA2 的 Truststore,或是直接指定為 Root CA 也行,在公司內 CA1 和 CA2 的 Root CA 是同一個。
Take Away
- truststore 要涵蓋所有需要被驗證的對象的 CA,包含 Server 自己的以及 Client 的。
- 升級 CA 時,要確認 Client 也都更新憑證了再換過去,或是暫時設定成 Root CA。
後記
很久沒有這樣解決問題了,像這樣解決別人的問題又能學到東西才是成長的動力。