從一個 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.needClientAuthtrue 的話,就會啟用 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
2
3
4
5
# 將 CA1 匯入 truststore
keytool -importcert -alias ca1 -file ca1.pem -keystore truststore.jks -storepass <password>

# 將 CA2 匯入 truststore
keytool -importcert -alias ca2 -file ca2.pem -keystore truststore.jks -storepass <password>

產生同時信任 CA1 和 CA2 的 Truststore,或是直接指定為 Root CA 也行,在公司內 CA1 和 CA2 的 Root CA 是同一個。

Take Away

  1. truststore 要涵蓋所有需要被驗證的對象的 CA,包含 Server 自己的以及 Client 的。
  2. 升級 CA 時,要確認 Client 也都更新憑證了再換過去,或是暫時設定成 Root CA。

後記

很久沒有這樣解決問題了,像這樣解決別人的問題又能學到東西才是成長的動力。


從一個 NiFi mTLS 問題搞懂 Keystore 與 Truststore
https://weiblog.me/2026-05-04/nifi-mtls-keystore-truststore/
Author
wei
Posted on
May 4, 2026
Licensed under