通过SSL使用MongoDB的Apache NiFi

问题描述

我已经遇到了与MongoDB(SSLContextService处理器)的SSL连接问题。

生成的所有证书(Root,Server和Client)。我已经用根证书签名的服务器和客户端证书。由于我的MongoDB-Sever具有多个IP地址,因此我将所有IP地址都包含在服务器证书中。

MongoDB还配置用于ssl连接(tls),在MongoDB中禁用了旧版本的tls(1.1、1.2)。

使用mongo-shell的SSL连接可以正常工作。我还用openssl s_client检查了所有内容,并且连接在那里并且也正常工作。

对于Apache NiFi,我已经创建了密钥库(PKCS12)

openssl pkcs12 -export -name client -in client.crt -inkey client.key -certfile ca.crt -out client.p12

,以及带有服务器证书的信任库

openssl pkcs12 -export -name server -in server.crt -inkey server.key -out server.p12

我也尝试过

openssl pkcs12 -export -name server -in server.crt -inkey server.key -certfile ca.crt -out server.p12

ca.crt是我的根证书。 client.crt和server.crt与此ca.crt相同。

我在NiFi中使用了这两种服务:

StandardSSLContextService和StandardRestrictedSSLContextService。在参数Keystore中,我已经将client.p12和truststore参数server.p12中。两种类型PKSC12。 TLS协议只是TLS。

但是无论如何,我会收到一条错误消息“ PKIX路径构建失败”。

我不确定我错过了什么,但可能已经有人遇到了这样的问题。

谢谢。

P.S。忘记了: 如果我在MongoDBControllerService参数中将“客户端身份验证”参数设置为“ NONE”,那么它将起作用。

解决方法

PKIX路径构建错误意味着NiFi无法在另一个端点(在本例中为MongoDB)提供的证书与相应信任库中加载的用于标识可信证书的任何证书之间构建可信的“路径”。

如果我看着我的侄女告诉我她被允许拥有她想要的所有糖果,我不太可能同意。但是,如果她有父母签名的纸条以确认身份,那么她会得到糖果。如果她在蜡笔上有自己签名的纸条,那就不要那么多了。

可能的解决方案是将根公共证书和节点证书连接到一个文件中(实际上只是cat server.pem ca.pem > combined_server.pem;确保节点证书位于第一位)。该命令假设证书文件采用PEM编码的ASCII格式(即以-----BEGIN CERTIFICATE-----开头),尽管这里.pem文件也可以包含此数据,但我更喜欢在此处使用.crt作为扩展名。然后,您可以通过以下方式验证该链是否正确

openssl verify -verbose -purpose sslserver -CAfile ca.pem combined_server.pem

为了保持一致性,我还要对客户端证书和CA重复该过程(在验证命令中使用-purpose sslclient)。然后重新生成PKCS12密钥库和信任库,并将它们加载到NiFi中。

我对您说在NiFi中禁用客户端身份验证允许此功能感到困惑,因为NiFi应该充当客户端,而客户端却无法确定客户端身份验证级别(实际上忽略了该设置)担任客户时)。只有在NiFi以某种方式充当服务器并且MongoDB是客户端的情况下,才应该发生问题。您使用的是哪个版本的NiFi和MongoDB?