[英]Nifi: how to make ListenHTTP work with SSL
由於 Nifi 通過 HTTP 與其他工具集成,我必須讓ListenHTTP
處理器面向公眾。 所有 3 個環境中的 API 網關對我來說太貴了。 因此,我關閉了外部網絡的所有 VM 入口端口(除了ListenHTTP
所需的端口)。
我的帶有StandardRestrictedSSLContextService
的ListenHTTP
配置不起作用。 沒有 SSL 它可以工作,但不安全。
user$ curl -X POST -H "Content-Type: application/json" --data "test" https://localhost:7070/test
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
.....
user$ curl -X POST -H "Content-Type: application/json" --data "test" --cacert cacerts.jks https://localhost:7070/test
curl: (77) error setting certificate verify locations:
CAfile: cacerts.jks
CApath: none
如何使ListenHTTP
與 SSL 證書一起使用? 我究竟做錯了什么?
更詳細的問題:
StandardRestrictedSSLContextService
將驗證客戶端是否在 TrustStore 中有證書。ListenHTTP
處理器保護一個端口 - 那么我不需要nifi.security.needClientAuth屬性或在“獨立實例,雙向 SSL”部分定義的所有環境變量,對吧? 我有點困惑,因為 Docker Image 和StandardRestrictedSSLContextService
都包含相同的配置,即 KEYSTORE_TYPE。ListenHTTP
處理器。ListenHTTP
配置為使用具有以下配置的StandardRestrictedSSLContextService
controller: .您使用的SSLContextService
可能不包含由可公開訪問的證書頒發機構 (CA) 簽署的證書,例如(僅用於解釋目的;不認可)Comodo、Verisign、Let's Encrypt 等。
由這些 CA 簽名的證書通常會被任意客戶端自動信任,因為構建客戶端的人(Java、Google/Microsoft/Mozilla/Apple 用於瀏覽器,Microsoft/Apple/Linux Distro 用於操作系統)已經搶先包含了這些頂級公共證書在客戶端的信任庫中。 您創建的信任庫cacerts.jks
采用 Java 密鑰庫格式, curl
碰巧不理解。 您可以使用此處的命令將公共證書從該密鑰庫導出到 PEM 格式的獨立文件,但這只會解決允許curl
與任意信任庫進行連接的直接問題。
如果您希望通用外部客戶端能夠通過 TLS 連接,則需要使用 NiFi 密鑰庫中由知名 CA簽名的證書。 您可以為此目的使用任何商業 CA,但Let's Encrypt確實免費提供此服務並且使用非常廣泛。 一旦您使用由 CA 簽名的證書,任何*客戶端都可以連接。
如果這僅供內部/企業使用,並且所有允許的客戶端都可以由您控制,那么您可以使用自簽名證書(就像您現在按照 Simon 的說明做的那樣),並將公共證書導出為您的任何格式其他客戶端需要與此特定服務器建立信任。 從理論上講,您還可以強制每個嘗試連接的客戶端還需要提供服務器(NiFi) 可以驗證的證書——這稱為相互身份驗證 TLS ,並增加了另一層安全性,因為只有經過身份驗證的客戶端才能進行對該服務器的請求。 如果您選擇這樣做,那么ListenHTTP
中的SSLContextService
也需要一個信任庫組件。
在不知道您的明確情況的情況下,我強烈推薦選項 1(簽名證書)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.