簡體   English   中英

Nifi:如何使 ListenHTTP 與 SSL 一起使用

[英]Nifi: how to make ListenHTTP work with SSL

客觀的

由於 Nifi 通過 HTTP 與其他工具集成,我必須讓ListenHTTP處理器面向公眾。 所有 3 個環境中的 API 網關對我來說太貴了。 因此,我關閉了外部網絡的所有 VM 入口端口(除了ListenHTTP所需的端口)。

問題

我的帶有StandardRestrictedSSLContextServiceListenHTTP配置不起作用。 沒有 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 證書一起使用? 我究竟做錯了什么?

更詳細的問題:

  1. 我應該將 cacerts.jsk 復制到發出查詢的機器嗎? 據我了解, StandardRestrictedSSLContextService將驗證客戶端是否在 TrustStore 中有證書。
  2. 如果我只需要使用ListenHTTP處理器保護一個端口 - 那么我不需要nifi.security.needClientAuth屬性或在“獨立實例,雙向 SSL”部分定義的所有環境變量,對吧? 我有點困惑,因為 Docker Image 和StandardRestrictedSSLContextService都包含相同的配置,即 KEYSTORE_TYPE。

已經完成了

  1. 這個問題文檔中,我對 KeyStore 和 TrustStore 有了一個大致的了解。
  2. 我已經啟動了Nifi Docker 容器 v1.10.0 ,並在 7070 端口上啟動並運行ListenHTTP處理器。
  3. 由於 Nifi 容器內的指令,我創建了 keystore.jks 和 cacerts.jks 文件。
  4. 我已將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM