客观的
由于 Nifi 通过 HTTP 与其他工具集成,我必须ListenHTTP
处理器面向公众。所有 3 个环境上的 API 网关对我来说太贵了。所以我关闭了所有虚拟机入口端口(除了ListenHTTP
) 对于外部网络。
Issue
我的配置为ListenHTTP
with StandardRestrictedSSLContextService
不起作用。如果没有 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
Question
怎么做ListenHTTP
使用 SSL 证书?我究竟做错了什么?
更详细的问题:
- 我应该将 cacerts.jsk 复制到发出查询的计算机吗?据我所理解,
StandardRestrictedSSLContextService
将验证客户端是否在 TrustStore 中拥有证书。
- 如果我只需要保护一个端口
ListenHTTP
处理器 - 那么我不需要nifi.security.needClientAuth https://docs.cloudera.com/HDPDocuments/HDF3/HDF-3.1.2/bk_administration/content/security-configuration.html属性或定义在的所有环境变量“独立实例,双向 SSL” https://hub.docker.com/r/apache/nifi部分,对吗?我有点困惑,因为 Docker Image 和StandardRestrictedSSLContextService
包含相同的配置,即 KEYSTORE_TYPE。
已经完成了
- 我对 KeyStore 和 TrustStore 有一个大概的了解这个问题 https://stackoverflow.com/questions/6340918/trust-store-vs-key-store-creating-with-keytool和文档 https://docs.oracle.com/cd/E19798-01/821-1841/gjrgy/.
- 我已经推出了Nifi Docker 容器 v1.10.0 https://hub.docker.com/r/apache/nifi启动并运行
ListenHTTP
7070 端口上的处理器。
- 我创建了 keystore.jks 和 cacerts.jks 文件,因为操作说明 https://www.simonellistonball.com/technology/nifi-ssl-listenhttp/Nifi 容器内。
- I have configured
ListenHTTP
to use StandardRestrictedSSLContextService
controller with the following configs:
.
The SSLContextService
您使用的可能不包含由可公开访问的证书颁发机构 (CA) 签名的证书,例如(仅用于解释目的;不认可)Comodo、Verisign、Let's Encrypt 等。
由这些 CA 签名的证书通常会被任意客户端自动信任,因为无论谁构建客户端(浏览器为 Java、Google/Microsoft/Mozilla/Apple,操作系统为 Microsoft/Apple/Linux Distro),都已预先包含了这些顶级公共证书在里面信任库客户的。您创建的信任库cacerts.jks
是 Java Keystore 格式,curl
碰巧不明白。您可以使用以下命令将公共证书从该密钥库导出到 PEM 格式的独立文件这里的命令 https://nifi.apache.org/docs/nifi-docs/html/toolkit-guide.html#additional_certificate_commands,但这只能解决眼前的问题curl
与任意信任库进行连接。
如果您希望通用外部客户端能够通过 TLS 连接,则需要使用 NiFi 密钥库中的证书,即signed由知名 CA 提供。您可以使用任何商业 CA 来实现此目的,但是让我们加密 https://letsencrypt.org/确实免费提供这项服务,并且使用非常广泛。一旦您使用由 CA 签名的证书,任何*客户端都将能够连接。
如果这仅供内部/企业使用,并且所有允许的客户端都可以由您控制,那么您可以使用自签名证书(就像您现在按照西蒙的说明所做的那样),并将公共证书导出为您想要的任何格式。其他客户端需要与该特定服务器建立信任。理论上,您还可以强制要求每个尝试连接的客户端也需要提供证书server(NiFi)可以验证——这就是所谓的相互验证 TLS并增加了另一层安全性,因为只有经过身份验证的客户端才能向该服务器发出请求。如果您选择这样做,那就是SSLContextService
in ListenHTTP
还需要一个信任库组件。
在不了解您的具体情况的情况下,我强烈推荐选项 1(签名证书)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)