我的目标是在docker群上的docker容器内运行分布式NIFI集群。我对官方NIFI docker映像进行的配置可以运行集群。
对于群集,我使用单个服务,每个副本是一个单独的NIFI实例。由于这项工作有效,因此我现在想继续进行安全性工作。我首先使用秘密(将信任和密钥库移交)将公开签名的通配符证书应用于Java应用程序。在我看来,这对于大多数分布式Java应用程序而言都是可行的方法。但是现在有了NIFI,我遇到了一个问题,即NIFI本身不支持通配符证书。
我目前正在考虑一种方法,该方法如何以每个容器都有其自己的证书的方式运行集群。我当前的想法是使用NIFI JVM可以信任的自我管理内部CA在容器内运行自我签名证书。由于我不确定100%是否会解决此问题,因此我很感谢提示和想法。
NIFI使用某些端口进行通信,并使用HTTP / S协议发出请求。 NIFI本身在节点/容器上作为Java应用程序运行。
答案 0 :(得分:1)
Apache NiFi提供了TLS Toolkit,可自动为您完成此过程。它可以运行临时的或长期存在的内部证书颁发机构(CA),该机构会生成内部密钥,并使用它们创建自签名的CA证书并签署传入的证书签名请求(CSR)。每个联机的节点都可以访问CA服务,并在其密钥库和信任库中安装正确配置的证书,并通过一次命令行调用自动为这些文件的位置和密码填充public List<BigDecimal> extractDecimals(final String s, final char fraction, final char grouping) {
List<BigDecimal> decimals = new ArrayList<BigDecimal>();
//Remove grouping character for easier regexp extraction
StringBuilder noGrouping = new StringBuilder();
int i = 0;
while(i >= 0 && i < s.length()) {
char c = s.charAt(i);
if(c == grouping) {
int prev = i-1, next = i+1;
boolean isValidGroupingChar =
prev >= 0 && Character.isDigit(s.charAt(prev)) &&
next < s.length() && Character.isDigit(s.charAt(next));
if(!isValidGroupingChar)
noGrouping.append(c);
i++;
} else {
noGrouping.append(c);
i++;
}
}
//the '.' character has to be escaped in regular expressions
String fractionRegex = fraction == POINT ? "\\." : String.valueOf(fraction);
Pattern p = Pattern.compile("-?(\\d+" + fractionRegex + "\\d+|\\d+)");
Matcher m = p.matcher(noGrouping);
while (m.find()) {
String match = m.group().replace(COMMA, POINT);
decimals.add(new BigDecimal(match));
}
return decimals;
}
文件。可以将其配置为在部署时通过Dockerfile,Ruby / Python / shell脚本等运行。
使用共享的秘密令牌值在SPKI上计算HMAC / SHA-256签名,以确保恶意/恶意服务不会获得已颁发的证书。所有证书都将由相同的CA证书签名,并且已经在信任库中进行了填充,因此群集中的每个节点都将信任其他证书。请求的CN也会填充在SAN条目中,并且支持其他SAN条目,因此符合RFC 6125。
如上所述,由于种种原因(some enumerated here),不支持也不建议使用通配符证书,而且还因为使用提供的工具包使更安全地部署唯一证书变得容易。正在进行各种工作(NIFI-5443,NIFI-5398),以修改一些内部群集通信以在面对通配符证书时具有弹性,但是目前尚不可用。