我有一个运行在openshift中的NIFI映像,另一个在云中的postgres由另一个部门“拥有”。
由于他们是通过客户端证书而不是用户名和密码登录的,因此他们向我们发送了一个证书(“ .crt”)和一个密钥(“ .key”)。我已经成功登录pgAdmin 4,但没有使用证书和密钥将NIFI连接到Postgres。
我已经将证书和密钥上传到了图像(使用秘密并安装了它),因此,如果我转到Pod终端,则可以访问它。
但是,当我将下面的连接字符串传递给DBCPConnectionPoll服务并激活ExecuteSQL处理器时,会收到证书无效的异常,如下所示:
ERROR
ExecuteSQL[id=...] Unable to execute SQL query <...>;
due to java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate).
No FlowFile to route to failure: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate)
我试图通过两种方式将证书传递给DBCPConnectionPoll服务:
1)作为连接字符串中的参数(“数据库连接网址”属性:
jdbc:postgresql://<ip>:<port>/<username>?user=<username>&sslTrue&sslcert=/etc/.../mycerts/mycert.der&sslkey=/etc/.../mycerts/mykey.key.pk8
2)在服务中添加属性(+按钮,并以正义参数名称和路径作为值),然后将其作为url传递:
jdbc:postgresql://<ip>:<port>/<username>
从总体上来说,这两者似乎都可以正常工作,因为我可以连接到我拥有的另一个不需要ssl认证的postgres。
一些注意事项:
1)我的假设是因为NIFI中的连接字符串无法正确读取证书和密钥的文件路径。
2)我已经多次将证书转换为java可以接收的不同类型,以查看是否是问题所在,但是我仍然收到相同的异常。因此,似乎连接池根本无法“实现”文件。不过,如果有人在这个话题上有发言权,那么在解决了主要问题之后便可以派上用场。因此,在这里也请注意一些技巧。
3)我还阅读了NIFI源代码,看来NIFI通常使用JDBC类来创建连接池,因此我传递的连接字符串在Java代码中可以使用,但在NIFI中不起作用(用Java编写)。
4)jdbc驱动程序和其他所有东西都配置正确,因为我可以在NIFI中使用非安全的postgres。
非常感谢您。
答案 0 :(得分:1)
一位同事找到了我所问问题的“简单解决方案”,我想与他人分享,以便为他人提供帮助。
缺少的是sslmode = require属性。包括这些之后,该服务运行良好。实际上,我不确定为什么它不能与sslmode = preferred一起使用,因为这是我的pgadmin用于同一个数据库的地方,并且在这里它可以完美地工作。在这种情况下,我们似乎必须``强制''nifi使用ssl-请参阅此处的文档:https://jdbc.postgresql.org/documentation/head/ssl-client.html。
此外,一些见解:
它使用'.der'证书和'.pk8'格式的密钥(不必根据其他服务的需要使用信任存储和密钥存储)。
可以像在Java代码中那样在“加号”按钮中添加属性并为它们赋予正确的名称,而不是将连接字符串中的每个属性都串联起来(请参阅上面问题中的第二个选项)。
使它也对其他人有帮助。